Newsgroups: alt.binaries.sounds.music Keywords: music file formats From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 1/6) Date: 23 Aug 1993 18:26:34 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Hello, -Fans, I'm currently writing (or should I say collecting ?) a FAQ-List about Music Files and everything around them on all HW-platforms with audio capabilities. One little problem is that my only two eyes cannot (always) look around the whole world. Please protest, when you think, that I have forgotten someone or something. Hints, comments and corrections are very appre- ciated. If you have any ideas, additions, or corrections, please let me know. But please, do _not_ send computer-religious hymns about which system or which format is the more beautiful! Disclaimer: This documentation does not include any warranty of any kind. I'm sure that you may find grammatical and technical errors herein. If reported, I'll correct them. This documentation (although not beeing software) is indented to be at a same state as freeware: You may use its contents or parts of it in its unmodified or a corrected or supplemented state. The co-authors and cited authors had previously released their material into the state of 'freeware' or 'public domain'. Otherwise they don't occur here. Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- Acknowledgements and Credits (in alpabetical order [last name]): Randy K Abel Rabel1@cup.portal.com Players on the PC (comp.sys.ibm.pc.soundcard) Mark J Cox m.j.h.cox@bradford.ac.uk bc732@cleveland.freenet.edu Freeware Modplay 2.19b (PC) Marc Espie espie@ens.fr First _complete_ (portable) source code of a MOD-Player for several platforms (tracker*.tar.Z) Lars Hamre larsha@Lise.Unit.NO "ZAP"/Amiga Freelancers Protracker (1.1B) Song/Module Format Jamal Hannah jamal@gnu.ai.mit.edu MOD Players for the Macintosh Peter "CRAYON" Hanning, Anders "DOLPHIN" Ramsay Mushroom Studios/Noxious Public Domain Protracker Infos Dan Hollis & Jon Pickard dhollis@cypher.com (Whiplash & Marxx Marvelous of TPPI) Decryption of the TFMX 2.0 Song File Format Players on the Atari Cris H"ulsbeck creator of TFMX and componist of wonderful TFMX-songs P.Georgueb, BAREA Freeware STM-to-MOD converter (PC) Teijo Kinnunen Oksantie 19, SF-86300 OULAINEN, FINLAND Public Domain-Docs of OctaMED File Structure Darren Schebek dschebek@outb.wimsey.bc.ca public domain FORM TRKR format Lukas Wunner lukas@phoenix.tp1.ruhr-uni-bochum.de (134.147.160.39) Players and composers on the Atari Jim Young ccjy@bristol.ac.uk (U4ia, APATHY=) (jim.young@bristol.ac.uk doesn't work) ccjy@sun.cse.bris.ac.uk () componist of wonderful MOD-songs Acknowledgements wanted: Norman Lin norlin@mailhost.ecn.uoknor.edu (PC: Modedit 3.01) Ed Mackey elm4@lehigh.edu, (215) 882-0138 611 E. 5th St., Lehigh University Bethlehem, PA, 18015 (Amiga: EdPlayer 2.1) Jan Ole Suhr jan_ole_suhr@m2tek.fido.de (PC: WOW, WOWII 1.30 (2.0b)) Norbert Unterberg Norbert_Unterberg@softstream.fido.de (PC: WinMod 1.0) ----------------------------------------------------------------- Contents [1.] Preface [1.1] alt.binaries.sounds.music [1.2] Coding of the Music Files before posting them [1.3] Some History [2.] What is a Music File? [2.1] Overview [2.2] The File Header [2.3] The Song [2.4] The Samples [2.5] Thoughts about Mono/Stereo Part 2: [3.] How to play MOD-Files? [3.1] MOD-Players on an Amiga [3.2] MOD-Players on an Atari [3.3] MOD-Players on a PC [3.3.1] plain vanilla DOS [3.3.2] MS-Windows [3.4] MOD-Players on a Mac [3.5] other MOD-Players Part 3: [4.] Where to get Music Files? [4.1] MOD-Files on ftp-servers [4.2] MOD-Files on BBSs [4.3] MOD-Files on CD-ROMs [5.] Converting Music Files [6.] How to create own MOD-Files? [6.1] Samples [6.2] Converting samples [6.3] MOD-Editors on an Amiga [6.4] MOD-Editors on an Atari [6.5] MOD-Editors on a PC [6.5.1] plain vanilla DOS [6.5.2] MS-Windows [6.6] other MOD-Editors [6.7] Hints on composing Appendix A [A.1] Some wellknown componists [A.2] Some MODs Appendix B [B.1] Related News Groups Part 4: Appendix C Internal Structure of Music Files [C.1] Music Files with synthetic instruments [C.1.1] ROL [C.1.2] CMF [C.2] Music Files with sampled Instruments [C.2.0] Music Files with 4 Channels [C.2.1] MOD - Soundtracker [C.2.2] MOD - Protracker Song/Module Format NST - NoiSeTracker [C.2.3] STM - ScreamTracker Module STS - ScreamTracker Song [C.2.4] MED - (?? Music EDitor) Part 5: [C.3.0] Music Files with more than 4 Channels [C.3.1] GTS - V0.9 [C.3.2] 669 - [C.3.3] Oktalyser [C.3.4] IFF FORM TRKR [C.3.5] TFMX 2.0 [C.3.6] Studio Session Format Part 6: [C.4] Hybrid Music Files [C.4.1] OctaMed [C.4.2] MIDI ----------------------------------------------------------------- [1.] Preface ------- Welcome to alt.binaries.sounds.music . [1.1] alt.binaries.sounds.music ========================= The news group alt.binaries.sounds.music was created to separate the music files from the pure sounds in alt.binaries.sounds.misc (see also the FAQ of Guido van Rossum in a.b.s.d). Types of Music Files ==================== Currently there are 3 general 'classes': - files with synthetic instruments (eg. ROL, CMF) - files with sampled instruments (eg. MOD, MED, TFMX, ...) - files with both, synthetic and sampled instruments (eg. OktaMED, MIDI) All types of music files are welcome here. [1.2] Coding of the Music Files before posting them ============================================= 1. Because some/most of the *nix mailing systems can not handle binary 8-bit-bytes but only standard 7-bit-ASCII, it is still strictly necessary to use a converter which puts the 8-bit values into 7-bit bytes with an offset so that all resulting codes are 'printable'. The de facto standard here is the combination of uuencode/uudecode with a file enlargement of 33% (3 bytes in, 4 bytes out). The slitely better atob/btoa (25% increase, 4 bytes in, 5 bytes out is not so popular. (Another utility, 'binhex' seems to be Mac-specific.) Because some mailing systems cannot handle files with more than 100 KBytes others with more than 50 KBytes, the encoded files should be splitted, if to large. The news reader SW has an option to automaticly concatenate and decode the posted encoded splitted files (NN :decode, TIN 's',tmpfile,'u'), where 'uu'decode is assumed. ___ 2. As far as I have seen yet, there are many views about the compression of the music files. Some notes: * no compression at all + no decompression and compatibility problems, - more traffic, - no transfere checks, - file date always set to 'today' For the following the compression gain depends very much on the input. So it may vary between 20% til 50%. * LHA(rc) + sources available for some/several systems, - some confusion with multiple version trees (which one to use: -lh1-, -lh4-, -lh5- ?) [last 'official' pgm-version: V2.55b, PC (Yoshi)] + 16 bit CRC, + saves/restores file creation date * ZIP 1.9P1 / UNZIP 5.0P1 + sources available for several systems, compatible with PKware's PKzip/PKunzip 2.04g for PCs. compatible --> GZIP 1.2.1, incompatible <-- GZIP + 32 bit CRC, + saves/restores file creation date * GZIP 1.2.3 + sources available for most systems, compatible <-- ZIP, incompatible --> UNZIP (compatible with compress) + 32 bit CRC, + saves/restores file creation date # On ftp servers you may find MOD,MED-files in either .lha or .zip format. # The (newest) sources for all three archivers should be available at wuarchive.wustle.edu and garbo.uwasa.fi via anonymous ftp. For those without ftp access many sites offer a PD-mail-service: Write a 1 line mail with 'pdget the_wanted_file' ___ ----------------------------------------------------------------- [1.3] Some History ============ Several months ago, the bussiness men have detected, that there is not only a keyboard and a screen to communicate with a computer. And when they had to find a name for the new 'product', they called it MultiMedia (MM). Long before MultiMedia was born, the separate disciplines of computer human interaction already existed. Here we only regard one view of the various output capabilies of a computer, the sound output. Lets start at the very beginning: Once upon a time there was a man called Adam, and because he was so alone ... Ok-ok, some years later ... In 1988 ... on an Amiga ... Karsten Obarski wrote the first program to use the 4-channel-sound-HW. Because he wanted to save the songs on the disk he created a format to store the musical stuff and the (sampled) instruments. Very soon the maximum of 15 instruments therein was too small and Per "Mahoney" Tufvesson & Anders "Kaktus" Berkeman extendet the format from 15 intruments to 31 instruments. (--> "M.K.") This became the world famous MOD-format, which is still used today. .. The idea of the Amiga players was ported to other systems (Atari, PC, SUN, Mac) .. Coming up with more powerful CPUs and several high quality sound and graphic cards, the PC was no longer a 'low budged game com- puter' but a respectable concurence in the range of MM. Especially in this PC-World we can currently see a boom of new MOD-Players. Although we can regard the upcoming wish for 16-bit-MODS with more than 4 channels and a sampling rate of 44 kHz instead of 8 kHz, the "old" standard MODs are still not OUT, especially regarding the potential mixing quality of 15 bits, and looking at the 'tons' of MODs all around the globe. But there are not only MOD-files containing music. Across all the systems you will find a lot of different formats, created independently. ----------------------------------------------------------------- [2.] What is a Music File? --------------------- When we talk about music files here, not only the most populare MOD files are meant, but the other song formats (with their own name) are included too. [] Nomenclature --------------- I have seen several documents usings the expressions over cross. So I should explain the meaning of the terms first as they are used in this document. channel, voice independent (virtual) channel, where sound can be directed to. stereo: left and right (HW-) channels only. instrument, sample An instrument is represented by one or more digital samples. Mostly there is only one sample per instrument. pattern A pattern describes all functions the player has to do at the moment. This includes the empty-function (wait for the next pattern). track A track is a collection of a fixed number of patterns. It cannot be truncated, also when a part of the track is unused. This can happen when a pattern command tells to jump to another pattern, and at the end of a song. song A song is the sum of all tracks needed to represent the piece of music. header Technical information about the hole module, located at the start of the file. MOD: MODule, "M_usic O_ffered in D_igital" (HZ) A music file consists of three parts: - a header containing a technical description, - the song subdivided into several tracks, and - a "library" of the used instrument samples. By playing the samples (instruments) at different pitches (frequencies) and modified with some effects a soundtrack lasting many minutes can be produced. [2.1] Overview -------- Most of the formats do not offer all capabilities needed to store all the information a componist can think of. But before you invent a new format you should study the list of currently published variants (see appendix C). Maybe the one or the other fits your needs. Across all variants and dialects of music file formats the general structure is always the same or similar to the following. So let's look at the picture: .---------------------------------. | header | magic | | |-----------------------| | | music title | The order may vary. | |-----------------------| | | track infos | | |-----------------------| | | sample 1 info | | |-----------------------| | | sample 2 info | | |-----------------------| | | sample 3 info | | |-----------------------| | | . | | | . | | |-----------------------| | | sample N info | |---------------------------------| | song | track 0 | | | Ch1 | Ch2 | ... | ChN | There are also formats | |-----------------------| with more than 4 channels. | | track 1 | | | Ch1 | Ch2 | ... | ChN | | |-----------------------| | | track 2 | | | Ch1 | Ch2 | ... | ChN | | |-----------------------| | | track 3 | | | Ch1 | Ch2 | ... | ChN | | |-----------------------| | | . . . . | | | . . . . | | | . . . . | | |-----------------------| | | track N | | | Ch1 | Ch2 | ... | ChN | |---------------------------------| | samples | sample 1 | In the most common formats | | | a music-file contains the | |-----------------------| complete structure, but | | sample 2 | there are also some vari- | | | ants, which do not include | |-----------------------| the sample data to save | | sample 3 | space on the disk. | | | | |-----------------------| | | . | | | . | | | . | | |-----------------------| | | sample N | | | | `---------------------------------' The detailed informations can be found in appendix C. [2.2] The File Header --------------- The header contains a technical description of the following song. Because there are many different formats, most of them have a special signature (a magic, e.g. "M.K.") to distinguish them from other file formats. But there are also formats without a magic (MOD15, ROL, GTS,...), and so it's hard to detect them. Most formats support a title field where the componist can fill in a name for the song (eg. "Take a Trip from me"). In those formats where the samples are stored within the music file, you will find a 'directory' of the available samples (very similar to the directory of a file system). This directory here contains information about the sample names (componist or composer choosen), start point and length of the samples and maybe some other stuff. In the formats with synthetic instruments the 'directory' may be replaced by the data itself describing the instruments (eg. CMF). ___ When there will ever be a New Standard, it should consider a comment field of variable length, because many MOD-authors use the ASCII-text fields for copyup/down/lefts, greetings, hints etc. (look at the 669-format in the appendix: but there are only 108 bytes. Also see below: Samples) Never trust the file system of *nix, VMS, and others according to file dates. As far as I'm not interested in a copy or ftp date but in the creation date of a file I cannot rely on the operating systems. The New Standard should describe a field in the header for the TRUE creation date, so that the files can be back dated. [2.3] The Song -------- The song part contains the musical instructions for the instru- ments (with easy words the sheets of music). The most differences between the formats can be found in the so-called "effects". This is the manipulation of the instrument samples before playing them. The most obvious are "volume" and "pitch" (note frequency). .. The "New Standard" should allow an unlimited number of voices (channels). .. [2.4] The Samples ----------- MOD format samples are simply signed, 8 bit raw digital data, with no header. Note that a sampled sound should be recorded at a 'C' pitch. If it is recorded at any other pitch, you'll have to do rate conversions to get it to a 'C', when you create own songs. Some MOD-componists have found a tricky way to include their README inside the MOD-file. They use the last sample (#31) for ASCII-text and never play this. Oktalyser samples are 8 bit signed data too, but because of the "chunk"ed strukture of Oktalyser-Mods they are preceeded by a SBOD-header (sample body). There are some formats, where the samples are missing: GTS, STS, MIDI. This has the advantage that the music files are much smaller. But if you transfere them to other systems, the target should have exactly the same sample/instument bank. Otherwise the music can not be played, or YOU must choose substitutions for the missing samples/instruments, or the player chooses automaticly the sub- stitutions which mostly sounds wrong. >From Midi-gurus you might hear that the possibility of selecting/ changing the instruments afterwards is a wanted feature. ----------------------------------------------------------------- [2.5] Thoughts about Mono/Stereo -------------------------- When the music files are played, the number of independent channels (voices) has to be reduced to the supported number of audio channels. This may be done be the HW or by the SW in mixing the channels together to mono or stereo. For MOD-files there are the rules mono = (ch1 + ch2 + ch3 + ch4) / 4 left = (ch1 + ch4) / 2 right = (ch2 + ch3) / 2 (how to sort them in 8-chan-MODs?) I've seen only 1 (one) player which does NOT assume that stereo means 2 absolutely different signals with no correlation between them. This player, the Sparc/SGI-Tracker supports a manner of more realistic stereo in mixing a special amout of the right channel into the left and vice versa. It's an empiric value bet- ween 0% (extreme stereo like the other players) and 100% (mono). I didn't try this yet (HZ), but it's proposed to take 30%. In conjunction with head phones you might need to use 70..95%. l' = [ (left * (200-p)) + (right * p) ] / 2 r' = [ (right * (200-p)) + (left * p) ] / 2 or /* p = 100 - q */ l' = [ (left * (100+q)) + (right * (100-q)) ] / 2 r' = [ (right * (100+q)) + (left * (100-q)) ] / 2 Future implementations of Mod-Players should allow the user to experiment with the stereo mixing factor. (I know that this is a bit more online work for the player, but CPUs become faster and faster..., or just mix it with analog resistors.) The not yet released TFMX-player will have this feature. ----------------------------------------------------------------- -- >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< zappe@gaea.sietec.de | | |--+- happy Harald Zappe | |/ composing work: +49-30-386-28328/29 / home: +49-30-ASK-ME /___ From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 2/6) Date: 23 Aug 1993 18:28:01 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- [3.] How to play Music Files? ------------------------ Playing a "complex sound file" as the music files are, is not as easy as playing "pure sounds" in *nix. cp file.mod /dev/audio will produce some strange noise. When you have enough patience to resist the noise (which is the header and song part), you can hear each instrument, but only once at one pitch. To get the real song, you need a special player. ----------------------------------------------------------------- [3.1] MOD-Players on an Amiga ----------------------- nic.funet.fi:pub/amiga/audio/applications/playback (12/92) Hints by Randy Abel (rabel1@cup.portal.com) The following are probably just sampled sound players (like the WAV and VOC player for the pc) 21552 Jun 15 1992 AGMSPlaySound-4.0.lha 10299 Jun 22 1992 DSound-0.91a.lha 47361 Dec 14 21:43 OmniPlay-1.23.lha 3521 Nov 2 23:57 PlayFile-1.2.lha 12306 Aug 5 01:36 SFX-2.4.lha This one plays Commodore 64 music files (non MOD files) 115749 Jun 15 1992 PlaySID-2.0.lha This is a background program which allows other programs to output sound (digitized) during certain events (ie: running a program, encountering an error, system warning, etc.) 20930 Sep 7 18:03 Upd-1.20.lha 55168 Oct 14 12:54 AMOSMEDPlayer.lha 262532 Jul 5 20:24 DeliTracker-1.21-demo.lha 110287 Jun 15 1992 EdPlayer-1.0.lha 124271 Jul 25 07:44 MultiPlayer-1.31.lha 20632 Jun 15 1992 NoisePlayer-3.5.lha 14509 Oct 5 1990 Oktaplayer.lha 21276 Jun 15 1992 UltraPlayer.lha ----------------------------------------------------------------- [3.2] MOD-Players on an Atari ----------------------- Lukas Wunner lukas@phoenix.tp1.ruhr-uni-bochum.de (134.147.160.?) writes: FTP sites I am referring to: RUS: University of Stuttgart (rusmv1.rus.uni-stuttgart.de / 129.69.1.12) Paderborn: University of Paderborn (athene.uni-paderborn.de / 131.234.2.32) Some of the Amiga editors and players have been ported to the Atari. Probably the most popular is the NoiseTracker which can be found on many ftp sites, among them RUS in /pub/soft/atari/sound/players. You can also retrieve the sources for the NoiseTracker there and a NoiseTracker Compiler. This program converts the NST modules to SEGM files. These can then be played on any Atari with almost no CPU usage. The NoiseTracker package contains the editor and a re- play program. Another very sophisticated tool is Audio Sculpture which you will find in the same directory. It is very fast and offers lots of functions. There's a host of other players, e.g. the Marx Tracker, but I only described the most important ones above. All of these players run on color monitors only. If you have a monochrome monitor, you're a bit out of luck: there are almost no MOD players for the high resolution. It is possible to run a color emulator and use e.g. the replay program included in the NST package, but the monochrome mo- nitor plays sound data at 71 Hz, the color monitor at 50 Hz. Thus, all MODs will be played at an incorrect speed. I know of one program that is also on RUS called PLAYER.LZH. This is the ABK-BBS player. The sound quality is not very good, but it's better than nothing. If you have an Atari with DMA chips (STe, TT or Falcon), there's one program you should get: Paula. Paula enables you to play MODs in the background while you work in another window. Paula uses the DMA to make all necessary MOD calculations, the CPU is not used. The quality of the output is ok. There's also a tiny program, Petra, which makes it possible to use Paula on the bog-standard ST that has no DMA chips. Both utilities can be found on Paderborn's FTP server in /pcsoft/atari/tools/sound. Here's also a directory with several other MOD players. By the way, Paula is a GEM application and can thus also be run on a monochrome monitor. ----------------------------------------------------------------- Date: Wed, 9 Jun 1993 22:24:34 -0500 (CDT) From: Dan Hollis Next to the Atari, there is no other computer with as many modplayers and editors. Since the Amiga and Atari share the same CPU (680x0), porting modplayers is simply a job of emulating the PAULA-soundchip in the Amiga, and using the Amiga-sourcecode for their players. On normal STs, your choice of modplayers will be limited a little bit. The newer trackerplayers use the 8 bit DMA sound of the STe/TT which is not available on normal ST. The normal ST has to use the YM2149, which doesn't have very good digisound-capabilities, and requires quite a bit of CPU-time to play. The 8 bit DMA sound of the STe/TT sound anywhere from just as good as the Amiga, to much better (i.e. 50khz 2x oversampling on the TT using Jukebox or Paula). The really new modplayers (like FalconPlay) use the new 16 bit DMA sound on the Falcon030, and they sound WONDERFUL! There are a wealth of different modplayers on the Atari, I am only able to list a small amount of them, there are too many to list. FalconPlay - By Griff of Electronic Images. Plays 4 voice ProTracker mods in 16 bit stereo at 50khz, with 2x oversampling on a Falcon030. That's WITHOUT using the DSP, btw. MarxxTracker - A really lame ModPlayer written by Marxx Marvelous of TPPI (our group). It really is simply a ProTracker modplayer written to test our own PAULA emulator. If you have this, don't use it. Use PTPlayer or BackTrack instead. ProTracker - Written by Karl Anders 0ygard of Delta Force. A full modeditor/player on the ST/STe/TT. Almost like the ProTracker on the Amiga, but with some differences: a better sample-editor, hidden game, etc. Trying to go commercial, a demo-version (without save, etc.) is available. BackTrack - A modplayer as a Desk accessory. Written by Karl Anders 0ygard, uses his ProTracker replay-rout to play mods in the background on STe/TT/Falcon030. Quite nice. JukeBox - Modplayer by Klaus Pedersen. A simple modplayer which has the ability to play mods in the background, and a strange ability to "compile" mods so they take 0% processor time to play (but take really much memory :^) On a TT it can play at 50khz with oversampling. Mplayer - Another modplayer, this works on ST/STe/TT. Will play mods in the background on a normal ST, but they sound really crappy then.. better to use BackTrack on i.e. a TT. Written by Hoang Viet Chi. Paula - A paula-emulator and background modplyer by Pascal Fellerich. Plays mods in the background on STe/TT, upto 50khz oversampling on a TT. This is a quite nice modplayer. Petra - A sound-driver for Paula, allows you to run Petra on a normal ST (but it sounds like crap). PTPlayer - Written by Petri Kuittinen. Uses the core of Griff's paula-emulator and modplayer to play mods on a ST. The nice thing is that it uses an 11-bit sound-table, so mods sound really nice on a poor ST. (As nice as possible, anyways!) CDPlayer - A modplayer on STe, which uses a GUI which looks like a CD player. I don't know which mod-engine it uses, it sounds o.k. but not as nice as BackTrack. DigiComposer - A really old mod-editor. Works on ST/STe/TT, but is quite buggy. Doesn't sound too good either. Better to use ProTracker. NoiseTracker - A really really old mod-editor. Almost straight port of the Amiga NoiseTracker, so you know it's crap. Sounds pretty bad, too. Audio Sculpture - I have only seen an early version of this. It's got a really nice userinterface. It allows you to display music playing on a scrolling-music sheet (like a MIDI-editor!) with standard musical notation. Very impressive, with an equally impressive price (it's commercial). TFMX Replay - Yeahh!! Now we're talking! This is our unreleased modplayer. Plays 8 voice TFMX mods on a normal ST. Plays on STe too, and a Falcon030 specific version is being worked on in a joint effort with Griff. Wait for its release! >>> Now : Where to get all the goodies! <<< Unfortunately, only a few Atari BBS's in the USA seem to keep up with this kind of musical-stuff. The better ones are: Ringworld - 303-699-0402 (Lotsa Atari modplayers, and megademos too. Also carries plenty of Amiga stuff, including mods.) Resaturant At The End Of The Universe - 713-531-6011 (Carries all the players listed in this document, and any new ones that may have been released. Carries the latest Falcon programs too.) If you have access to the Internet, and have FTP then you are in luck! All these programs are available at two main sites: Atari.Archive.Umich.Edu /atari/ Atari archive is "the" main ftp site for Atari stuff for the whole world. You can be sure anything new will probably be released here. Plenty of modplayers. Check Amiga.Archive.Umich.edu for plenty of mods! :) Ftp.Uni-kl.De /pub/atari/ The main ftp site for Europe. Carries most modplayers, and is "the" ftp site for all the latest megademos (and a few mods too). If you have any questions about Atari trackers, please contact me by electronic-mail at: dhollis@zero.cypher.com or dhollis@bitsink.gbdata.com Happy modplaying! -Dan (Whiplash of TPPI) "Goemon" on IRC ----------------------------------------------------------------- [3.3] MOD-Players on a PC ------------------- >From: Rabel1@cup.portal.com (Randy K Abel) >Newsgroups: comp.sys.ibm.pc.soundcard >Subject: IBM MOD Players Compared! >Date: Fri, 2 Jul 93 20:14:12 PDT >Organization: The Portal System (TM) This is a comparison of all of the IBM MOD music file players that I have come across. Friday - (07/02/93) ========================================================================= | | |Edit |EMS|Graphical| Shell |Built-in|Zipped|286| |Program Name |Version|MODS?|OK?|Playback?|to DOS?| Menu? |Files?|ok?| |---------------|-------|-----|---|---------|-------|--------|------|---| |3D Mod | 1.00 | No |Yes|Yes in 3D| No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |666 Play | 1.50 | No |Yes| Yes | Yes | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |B's Pro Tracker| 0.05B2|w/reg|Yes|Ansi Only| Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Brain | 1.20 | No |Yes| Yes | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |CD-Box | 3.00A | No |Yes|Ansi Only| No | Yes | Yes |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Composer 669 | 1.03 | Yes | No| No | No | Yes | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |Creator | 1.10 | Yes |Yes| No | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Dark-Tracker | 2.41 | Yes | No| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Dark-Trkr Plyr | 2.01 | No | No| Yes | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Digi Studio | 1.50 |w/reg|Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Digitrak | 0.01b | No |Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Dual-Mod Player| 2.54 | No |Yes|Ansi Only| Yes | No | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |Execmod | 1.0b | No |Yes| No | ??? | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |FastTracker | 1.01 | Yes |Yes| No | No | Yes | No |???| |---------------|-------|-----|---|---------|-------|--------|------|---| |Galliasoft Mod | 1.35 | Yes |Yes| Yes | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |GTS | 0.91 | Yes |Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Gus Mod | 2.11 | No |Yes| Yes | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Gus Play | 1.50 | No |???| Yes | Yes | No | No |???| |---------------|-------|-----|---|---------|-------|--------|------|---| |Holoplay | 0.00 | No |Yes|Ansi Only| No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Intellitracker | 2.00 | No |Yes| Somewhat| No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |JAMP | 1.50 | No | No|Ansi Only| No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |JM Player | 1.00 | No | No| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |JM Pro Tracker | 5.00 | No |Yes| No | Yes | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |KingMod | 1.11 | Yes |Yes| No | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |MFed | 1.52 | Yes |Yes| Yes | No | Yes | Yes |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Mod2 |1.baby | No |Yes| No | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Modac |1.9305 | No | No| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Modus | 0.10 | No |Yes| Yes | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Mod Edit | 3.01 | Yes |Yes| No | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Mod Player | 2.19b | No |Yes| Yes | Yes | Yes | Yes |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Mod's Grave | 1.53 | No |Yes| No | No | No | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |M.O.T. Modplay | 1.01 | No |Yes| No | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |MultiPlayer | 1.00 | No |Yes| No | No | Yes | Lzh |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |OCTA | 2.00 |w/reg| No|Ansi Only| No | Yes | No |???| |---------------|-------|-----|---|---------|-------|--------|------|---| |Play Mod | 1.00 | No | No| No | Yes | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Power Player | 1.30 | No | No| No | Forced| No | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |Pro Mod | 1.10 | No | No| Yes | Yes | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Prot. Mod Plyr | 2.22 | No |Yes| Yes | Yes | No | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |SB Studio | 1.10 |w/reg|Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Scream Tracker | 2.25 | Yes |Yes| Yes | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |SLMP | 1.9b | No |Yes| No | Yes | Yes | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |Soundtraker | 2.0+ | No | No| No | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Sound System | 1.10 | No | No| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Super Pro Play | 1.31 | No |Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Tetra Composer | 1.00 |w/reg|Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |TextBar Mod | 1.00 | No |Yes| Yes | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Trakblaster | 2.00 | No | No| Yes | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |TuPlay | 1.00 | No | No| Yes | No | Yes | No | No| |---------------|-------|-----|---|---------|-------|--------|------|---| |Ultra Tracker | 1.10 | Yes |Yes| No | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |VangeliSTracker| 1.2b | No |Yes| Yes | Yes | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Vectorballs MP | 2.20 | No |Yes| Yes | No | No | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Visual Player | 2.00 | No |Yes| Yes | Yes | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Whacker Tracker| 1.01u | Yes |Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Win Mod Pro | 0.003 | No |Yes| No | Yes | Yes | Yes |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Wow | 2.01 | No |Yes| Yes | No | Yes | No |Yes| |---------------|-------|-----|---|---------|-------|--------|------|---| |Wow II | 1.31 | No |Yes| Yes | No | No | No |Yes| ========================================================================= ========================================================================= New Stuff: Two Weeks of June 19, 1993 to July 2, 1993 * New player called 3D Mod (version 1.00) This one displays volume bars in 3D as well as the Module name and graphic boxes but you'll need red/green glasses to view it properly. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New player called 666 (version 1.50) A VGA only program with some graphical playback. Looks like a CD Player. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New Player called Multi-Player (version 1.00) This one plays all the formats including mod, stm, nst, 669, wow, 8cm, 6cm, s3m, s2m, and okt. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New player called Modus (version 0.10) For the Gravis Ultra Sound Only! This is a Windows 3.0+ based MOD music file player with graphical volume bars. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New player call TextBar Mod (version 1.00) A VGA only simple mod player that displays 4 red graphic volume bars on your current text screen without effecting what is on the screen. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New player called Ultra Tracker (version 1.10) A nice looking Gravis Ultra Sound Only MOD music player/editor with up to 32 channels of music! Shareware. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New version of Dual Mod Player (version 2.52 to version 2.54) + WSS support - Bug fixes + VDS support + DMP now works with Windows Sound System and compatibles (like Compaq BusinessAudio) + Support for Virtual DMA Services has been added, which means that DMP should now run better under OS/2 and Windows. * DMP is now *cardware*. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New version of CD-Box (version 2.20 to version 3.00) New looks and new features. This program can now handle archived music files. It has internal support for many music formats plus external support for others. Supports mod, mid, cmf, rol, voc, and more sound files. (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New version of Win Mod Pro (version .002 to version .003) A new version to this WINDOWS only MOD music file player. Now has support for archived files, better file selection, and more! (available on ftp.uwp.edu in /pub/incoming/modplayers dir) * New version of Mods Grave (version 1.03 to version 1.53) This is a mod player for Dos, Windows and OS/2. It freezes up sometimes on my machine (in DOS mode). (available on ftp.uwp.edu in /pub/incoming/modplayers dir) ========================================================================= CD-Box, ModEdit, ModPlayer, JMPlayer, Power Player & Scream Tracker are available on SIMTEL (in sound or music directories). Try oak.oakland.edu or other SIMTEL mirror site. Other players can be found on: oliver.sun.ac.za (pub/msdos/audio directory) wuarchive.wustl.edu (pub/MSDOS_UPLOADS/sounds directory) picasso.ocis.temple.edu (pub/sound/players) ftp.uwp.edu (pub/msdos/modplayers or pub/incoming/modplayers areas) archive.epas.utoronto.ca (pub/pc/ultrasound/sound) ===================================================================== Notes: The EMS OK column is used to let you know if the MOD player sounds Correct with an EMS memory manager loaded. In most cases these Players will still work but they will sound distorted. Additional Info: ============================== Supported Devices ================= | | |=======================| Additional | |Program Name |Archive File|SB|PRO|DAC|GUS|PAS|SPKR| Comments | |---------------|------------|--|---|---|---|---|----|---------------| |3D Mod |3dmod10.??? | X| X | X | | | X |need 3D glasses| |---------------|------------|--|---|---|---|---|----|---------------| |666 Play |666.??? | X| X | X | | | X |requires VGA | |---------------|------------|--|---|---|---|---|----|---------------| |B's Pro Tracker|bpt05.??? | X| | X | | | X |mod/stm/midi | |---------------|------------|--|---|---|---|---|----|---------------| |Brain |brain12.??? | X| | X | | | X |stereo w/2 dacs| |---------------|------------|--|---|---|---|---|----|---------------| |CD-Box |cdbox300.???| X| X | X | | | X |requires VGA | |---------------|------------|--|---|---|---|---|----|---------------| |Composer 669 |compsd13.???| X| X | | | | |669 files 8chnl| |---------------|------------|--|---|---|---|---|----|---------------| |Creator |creator1.???| X| | | | | |German Docs | |---------------|------------|--|---|---|---|---|----|---------------| |Dark-Tracker |darkplay.???| X| | X | | | X |No Docs/mod/stm| |---------------|------------|--|---|---|---|---|----|---------------| |Dark-Trkr Plyr |darkplay.???| X| | X | | | X |No Docs/mod/stm| |---------------|------------|--|---|---|---|---|----|---------------| |Digi Studio |ds15demo.???| X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Digitrak |digitk01.???| | | | X | | |GUS only plyr | |---------------|------------|--|---|---|---|---|----|---------------| |Dual-Mod Player|dmp254.??? | X| X | X | | X | X |mod/nst/669/s3m| |---------------|------------|--|---|---|---|---|----|---------------| |Execmod |exec10b.??? | X| | | | | |Run pgm in bkgd| |---------------|------------|--|---|---|---|---|----|---------------| |FastTracker |ftracker.???| X| | X | | | X |internal docs | |---------------|------------|--|---|---|---|---|----|---------------| |Galliasoft Mod |med135.??? | X| | X | | | X |Reqs Mod Play | |---------------|------------|--|---|---|---|---|----|---------------| |GTS |gtsmain.??? | X| | | | | |gts w/converter| |---------------|------------|--|---|---|---|---|----|---------------| |Gus Mod |gmod211.??? | | | | X | | |GUS only | |---------------|------------|--|---|---|---|---|----|---------------| |Gus Play |gusp15.??? | | | | X | | |GUS 4-8 chanels| |---------------|------------|--|---|---|---|---|----|---------------| |Holoplay |hp00a.??? | X| X | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Intellitracker |intrack.??? | X| | | | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |JAMP |jamp.??? | X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |JM Player |jmplay11.???| X| | | | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |JM Pro Tracker |jmprotr.??? | X| X | X | X | | |mod/nst/wow etc| |---------------|------------|--|---|---|---|---|----|---------------| |KingMod |king111.??? | X| | | | | |std. music note| |---------------|------------|--|---|---|---|---|----|---------------| |MFed |mfed152.??? | X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Mod2 |catlomod.???| X| | X | | | X |simple mod plyr| |---------------|------------|--|---|---|---|---|----|---------------| |Modac |modac1.??? | X| X | X | | | X |mod/voc/wav | |---------------|------------|--|---|---|---|---|----|---------------| |Modus |modus.??? | | | | X | | |Windows only | |---------------|------------|--|---|---|---|---|----|---------------| |Mod Edit |moded301.???| X| | X | | | X |Reg only $15 | |---------------|------------|--|---|---|---|---|----|---------------| |Mod Player |mp219b.??? | X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Mod's Grave |grave153.???| X| X | | | | |skips sometimes| |---------------|------------|--|---|---|---|---|----|---------------| |M.O.T. Modplay |mp_101.??? | X| X | X | | X | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |MultiPlayer |multip10.???| X| X | X | | | X |mod/wow/stm/669| |---------------|------------|--|---|---|---|---|----|---------------| |OCTA |octademo.???| X| X | | | | |mod/nst/oct | |---------------|------------|--|---|---|---|---|----|---------------| |Play Mod |playmod.??? | X| | | | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Power Player |pp13.??? | X| | X | | | |mod/wow/stm/nst| |---------------|------------|--|---|---|---|---|----|---------------| |Pro Mod |promod.??? | X| X | | | | |use -m for SBs | |---------------|------------|--|---|---|---|---|----|---------------| |Prot. Mod Plyr |pmp222.??? | X| X | | | X | |Big mod/nst/s3m| |---------------|------------|--|---|---|---|---|----|---------------| |SB Studio |sbstudio.???| X| X | | X | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Scream Tracker |st225.??? | X| | X | | | X |mod/stm files | |---------------|------------|--|---|---|---|---|----|---------------| |SLMR |silly19b.???| X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Soundtraker |minitrak.???| X| | | | | |no docs | |---------------|------------|--|---|---|---|---|----|---------------| |Sound System |ss11.??? | X| | | | | |tends to crash | |---------------|------------|--|---|---|---|---|----|---------------| |Super Pro Play |spp-v131.???| X| | | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Tetra Composer |tetra10.??? | X| | | | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |TextBar Mod |tbmod10.??? | X| X | X | | | X |requires VGA | |---------------|------------|--|---|---|---|---|----|---------------| |Trakblaster |tblast20.???| X| | | | | |keep all files!| |---------------|------------|--|---|---|---|---|----|---------------| |TuPlay |tuplay10.???| X| | X | | | |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Ultra Tracker |ultra11.??? | | | | X | | |requires VGA | |---------------|------------|--|---|---|---|---|----|---------------| |VangeliSTracker|vtexe12b.???| X| X | X | | | X |wow/stm/669/mod| |---------------|------------|--|---|---|---|---|----|---------------| |Vectorballs MP |vm2-22.??? | X| X | | | | X |Vectorball GFX | |---------------|------------|--|---|---|---|---|----|---------------| |Visual Player |vp20.??? | X| X | X | | | X |Cool Graphics | |---------------|------------|--|---|---|---|---|----|---------------| |Whacker Tracker|wt101u.??? | X| X | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Win Mod Pro |wmp003.??? | X| X | X | X | X | X |Windows Only | |---------------|------------|--|---|---|---|---|----|---------------| |Wow |wow201.??? | X| | X | | | X |mod/nst | |---------------|------------|--|---|---|---|---|----|---------------| |Wow II |wowii130.???| X| X | | | | |mod/nst | ====================================================================== Notes: Only a few Mod players specifically mention PAS support but from what I've heard the PAS is 100% SB compatible so it should work with any player that supports Sound Blaster. PS: There is a new ADLIB Music file player that plays its own format of music files. The player is called HSC-Tracker (version 1.00). While it doesn't play MOD files its own format sounds pretty good. It comes with about 50 songs and has a full 9-channel music editor as well as a TSR music player which lets you play music in the background. It will work with any Adlib compatible card (including SoundBlasters). The file is called trak-ecr.zip. (available on wuarchive.wustl.edu in /pub/msdos_uploads/sounds dir) ====================================================================== If you find any errors, omissions or new versions of the above players please send me a note. Thanks to all who sent me suggestions & additional information! Randall Abel (rabel1@cup.portal.com) ----------------------------------------------------------------- [3.3.1] plain vanilla DOS ----------------- * Trackblaster (Volker Zinke) ------------ * WOW (Jan Ole Suhr) --- * WOWII (Jan Ole Suhr) ----- * ModPlay (Marc J Cox) ------- MODPLAY PRO (C) Mark J Cox 1990/1991 Version 2.19b * VP Visual Player -- Visual Player Version 1.0, Barcelona, October '92 Player & FFT by H'ector Mart'inez Graphics & program by Luis Crespo Sound Blaster Pro by David L'opez & Angel Trigo (authors of ProMod) Luis Crespo: FidoNet 2:343/108.21 Angel Trigo: FidoNet 2:343/121.242 David Lopez: FidoNet 2:343/121.989 * RP Rainbow Player -- RAINBOW Player V1.4 / ProTraker MODule Player (C)1992 Sebastian M. The technical Data of RP: - 99% ProTracker compatible (Except:InvertLoop & FunkRepeat) - 4 Osziloscopes of the respective Channels - 4 Modulation Displays - Instrument Display Field - Stereo !TRUE! 7 Bit per Channel - Mono 6 Bit per Channel - Play the MODs in induced Order (Tagging) - LHA/ZIP/ARJ Packer Support More when you see it :-) Sebastian Mies "Uberaucherstr. 4 7734 Brigachtal, Germany Tel.: ++49-07721/28070 FidoNet: Sebastian Mies, 2:247/8.4 * DMP Dual Mod Player --- Dual Module Player Copyright (C) 199x Otto Chrons Fidonet: 2:222/352.7 SBC-net: 14:1510/500.7 (this is not a good way to contact me, use Fidonet if possible) InterNet: c142092@cc.tut.fi (fastest method to contact) Newest version is always available at: NCS +358-31-420034 24h v.32bis R.A. LAW +358-37-49007 24h v.32bis ----------------------------------------------------------------- [3.3.2] MS-Windows ---------- * MTMOD (Jan Ole Suhr) ----- Not a Windows-Application, but can be used in a DOS-box. * WinMod V 1.0 (Norbert Unterberg) ------ Norbert Unterberg Fido: 2:245/36.4 Koehlerstr. 12c Internet: Norbert_Unterberg@softstream.fido.de 5802 Wetter 2 CompuServe: 100112,2740 Germany * WinMod Pro V 0.02b2 (James Holderness) ---------- WinMod PRO An MS-Windows MOD file player. v 0.02b2 Copyright (c) 1992 DweebSoft Written by James Holderness Programmed by: James Holderness Copyright: DweebSoft 1992 Email address: jholdern@casper.cs.uct.ac.za (probably not for long after 11/92) Fido address: James Holderness @ 5:7102/112 Snail mail: 74 Simonstown Rd, Fish Hoek, 7975 R.S.A. Bulletin board: If you're in the R.S.A. or like long distance phone calls, try out Connectix BBS (031-2669992). My user id is Dweeb. News groups: I also read comp.sys.ibm.pc.soundcard and comp.sys.amiga.audio from time to time, but don't count on me seeing anything there - especially after 11/92. ----------------------------------------------------------------- [3.4] MOD-Players on a Mac -------------------- >Subject: Mac Music Info Sheet (Finished!) MOD Players for the Macintosh 8/1/93 Release, by Jamal Hannah Yes! There are Mod players for the Mac! All of them can be found on FTP site sumex.stanford.edu in pub/info-mac/sounds/util Name Vers Author Edits? Note ----- ---- ------- ------ ----- Sound Trecker 1.0 Frank Seide no The De Facto Mac Mod player. AlphaTrecker 2.0 Fred Condo no Plays MOD at startup MOD Voicer 1.1 Kip Walker no Utility to rip samples from mod The Player II 2.5 Antoine Rosset no Same playing code as S. Trecker Mac Tracker 1.00 Thomas Lawrence no Slow. Plays some thing ST wont Player Pro beta 4.05 Antoine Rosset yes Editor! But not in beta vers. "Sound Trecker" was origionaly in German but called "Sound Tracker".. it comes with source code and compiled modules for playing some mods. It does not play all SoundTracker, NoiseTracker, or ProTracker mods by any means! The problems break into 2 categories: 1) Those mods which it plays incorrectly. Some mods that Sound Trecker plays seem to have samples in them that the program does not like.. they sound garbled and scratchy. 2) Those mods which it can't even open. Any mods with the signature signature "FLT8" (created by the Amiga "StarTrekker" program) will not play.. you have to use Player Pro for them, or mabye Mac Tracker. SoundTrecker's name is of course derived from the Amiga "Sound Tracker" program. It isnt a "true" tracker though, because it does not edit MODs! (It's an annoying trend to see all these players called "trackers".) AlphaTrecker 2.5 and The Player II both use Frank Seide's MOD playing code, so the playing quality is much the same. "Mac Tracker" and "Player Pro" play many mods that those programs do not, but some mods that don't work with Mac Tracker or Player Pro work on Sound Trecker/Player II. Go figure. (Player Pro cant correctly play mods like "batmeat.mod", "pkk-20-seconds", mamushka.mod, and others). The Player Pro is a beta version, and does not edit/save mod files yet.. but it is lot's of fun to use! It also claims to load up MIDI files, as well as play with special routines for the Mac Quadra 840av (codename: Cyclone) and the Centris 660av ("Tempest") DSP chip. Newest Macs: The Cyclone, and the smaller Tempest, represent 2 new Mac's with enhanced sound capabilities (probabaly like the Atari Falcon, with it's DSP.. or the NeXT).. including 16 bit sounds at 44khz sampling (CD quality). A DSP also means the potential for "unlimited" sound channels, instead of just 4.. as well as built-in DMA. This all makes for some pretty impressive music capabilities at very minimal impact on system performance/CPU time. The Tempest stats: 25MHz 68040, 55MHz DSP 16bit colour, one slot which can be made into a nubus slot. Otherwise identical to the Quadra 840AV. Pretty much the ideal Mac Mac model for MOD playing, and can probably deliver sound comparable to an Amiga 4000 or Atari Falcon, for around $2000. Old Macs: There is no MOD player for the older Macintoshes right now (any Mac without an "ASC" Chip.. i.e. Apple Sound Chip.) This includes the Mac 128, Mac 512 ("Fat Mac"), Mac Plus, Mac SE, Mac SE 030, or Mac Classic. There is, however, a commercial product that works on older Macs called "Studio Session" that produces files more or less just like MODs, but with 6 voices! (The Music for "Falcon" and "Tetris" for the Mac was produced with this program.) It's interesting to realize that the Studio Session format has been around since about 1986 (2 years before the Amiga Sound Tracker was 1st written by Karsten Obarski). The problem with the Studio Session File Format is that the music and instrument data are in seperate files. A rough description of the Studio Session File formats can be found in the appendix. Send all additions/corrections to: jamal@gnu.ai.mit.edu ----------------------------------------------------------------- [3.5] other MOD-Players ----------------- * Tracker for SUN-Sparc, SGI, linux tracker V3.10, Marc Espie, Paris (C-Sources) ----------------------------------------------------------------- -- >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< zappe@gaea.sietec.de | | |--+- happy Harald Zappe | |/ composing work: +49-30-386-28328/29 / home: +49-30-ASK-ME /___ From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 3/6) Date: 23 Aug 1993 18:29:20 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- [4.] Where to get Music Files? ------------------------- There are several ways to obtain the songs. One possiblity not discussed here, is to ask the friends whether they have new songs. When you have internet access you can look at the following ftp- servers. With a modem you can try to register at a local BBS. Or you buy one of the available CDs containing MOD- and other songs. [4.1] MOD-Files on ftp-servers ------------------------ >From lukas@trillian (now @phoenix) Thu Jan 21: There are hundreds of anonymous-ftp sites that carry MODs. In fact, you will find MODs on almost all sites with Amiga stuff. Here is a list of some of the best MOD sites. Usually, there are sub-directories for MED music, Future Composer stuff, 8-voice MODs and the Sound/Pro/ Noisetracker MODs. Sometimes there are also sub-directories for samples. A. nic.funet.fi (Scandinavia, 128.214.6.100), /pub/amiga/audio (there are subdirectories for Future Composer, MED, Oktalyzer, C64 SID and "normal" MODs plus three folders with samples) B. garbo.uwasa.fi (Scandinavia, 128.214.87.1), /pc/sound (messy directory with MODs, STMs, players and trackers for PCs) C. Info.brad.ac.uk (UK, 143.53.2.5), /misc/mods (there are sub-directories for all letters of the alphabet plus the "classical" folder for classical MODs) or /incoming/mods for new MODs D. atari.archive.umich.edu (USA, 141.211.165.41), /atari/Sound/Mods (several huge ZOO archives with MODs) E. wuarchive.wustl.edu (USA, 128.252.135.4), /systems/amiga/audio/music (there are sub-directories for MED, 8-voice, self-playing and "normal" MODs) and new MODs in /systems/amiga/incoming/mods or /systems/amiga/incoming/audio F. saffron.inset.com (192.94.75.2), /pub/sound/samples/newmods, /pub/sound/samples/mod, /pub/sound/samples/pro-mods G. merlin.etsu.edu (USA, 192.43.199.20), /ab20/AMIGA/SOUNDS/MODULES (this is a CDROM mirror of ab20.larc.nasa.gov which seems to have closed ftp services; there are sub- directories for MEDs, self-playing and "normal" MODs) H. the Aminet archives: Aminet is an association of several machines in different countries. All Aminet machines have a folder with the same directory structure. Uploads to one of the machines are automatically forwarded to all other participants, so you will find the same directories on all participants. The center of Aminet is amiga.physik.unizh.ch. All files can be found on this machine, ftp.luth.se and ftp.etsu.edu, the other mirrors have at least the last 100 days'. Here is a list of all Aminet participants: Switzerland amiga.physik.unizh.ch 130.60.80.80 pub/aminet/ Switzerland litamiga.epfl.ch 128.178.151.32 pub/aminet/ Scandinavia ftp.luth.se 130.240.18.3 pub/aminet/ Germany ftp.uni-kl.de 131.246.9.95 pub/aminet/ Germany ftp.cs.tu-berlin.de 130.149.17.7 pub/aminet/ Germany ftp.th-darmstadt.de 130.83.55.75 pub/aminet/ USA ftp.etsu.edu 192.43.199.20 pub/aminet/ USA oes.orst.edu 128.193.124.2 pub/aminet/ You will find MODs in /pub/aminet/mods on all Aminet machines. There are sub-directories for 8-voice, SoundFX, MED, NoiseTracker, ProTracker and SoundTracker MODs. Many MOD directories are mirrored on other ftp sites, too. For example, rusmv1.rus.uni-stuttgart.de (Germany, 129.69.1.12) has many MODs from E. and H. (see above) in /pub/soft/amiga/sound/mods and the huge ZOO archives with MODs of D. in /pub/soft/atari/sound/mods. ------------------------- Some other servers, found in conversations in net news, but newer tested (HZ): a.cs.uiuc.edu amiga, GNUmake, GNU cs.utah.edu 128.110.4.21 Worm Tour, amiga, forth, utah csuvax1.csu.murdoch.edu.au 134.115.4.1 amiga, elmdocs, internet forwiss.uni-passau.de 132.231.20.10 SML of NJ, GraphEd, amiga, iesd.auc.dk 130.225.48.4 amiga, mac, msdos, myth ix1.cc.utexas.edu 128.83.1.21 amiga louie.udel.edu 128.175.2.33 MH, amiga mrcnext.cso.uiuc.edu 128.174.201.12 amiga mtsg.ubc.ca 137.82.27.1 msdos, unix, amiga, os2 plains.nodak.edu 134.129.111.64 apple, msdos, mac, amiga, procyon.cis.ksu.edu mac, amiga, misc titan.rice.edu 128.42.1.30 sun-spots, amiga, ispell, ux1.cso.uiuc.edu 128.174.5.59 amiga, fish, amicus, cucug vaxb.acs.unt.edu msdos, amiga, midi, network vmtecmex.cem.itesm.mx 132.254.1.4 amiga, msdos, gif ----------------------------------------------------------------- [4.2] MOD-Files on BBSs ----------------- germany: Bitblaster Passau ... ... ----------------------------------------------------------------- [4.3] MOD-Files on CD-ROMs -------------------- "Public Domain Sound CD-ROM 2" more than 800 sound files as far as utili- ties and programs for soundcards Datamedia GmbH/Pronet, Munic, Germany (approx. 70,- DM, 11/92) "Ultimate MOD Collection CD-ROM" This isn't a full review or anything, but if you are into MOD files and have access to a CD-ROM drive, get the Ultimate MOD Collection CD-ROM. I just got mine, and it's jam-packed with players for everything from Amigas to Sun SGI's. It's got MODS and instruments in LZH compressed format (for BBS's) and un- compressed format. Its available from Sunset Productions in Texas. >From: gerry@pizzabox.dialogic.com (Gerry Lachac) ... ... ----------------------------------------------------------------- [5.] Converting Music Files ---------------------- * TOAMIGA (PC) (included with ModPlay 2.19b) ToAmiga Music Module Converter Ver 1.00 Copyright (c) MCMXCII greek[P.Georgueb, BAREA] Usage: ToAmiga Converts a Scream Tracker module to an Amiga SoundTracker/ NoiseTracker module. Source and/or target may include drive and/or path. No wildcards are allowed. You may freely use and distribute this program in its un- altered form. *** Was free, Is free, Always free *** * MIDIMOD * MOD2MIDI * MOD2VOC * MOD2AU ----------------------------------------------------------------- [6.] How to create own MOD-Files? ---------------------------- After listening to the Megabytes (Gigabytes) of more or less wonderfull, ready-for-use MOD-Songs, you may have the wish to produce some own pieces of music, because you are the only one who exactly know your personal, musical taste. But be aware that composing is an art. (--> rec.music.compose) ----------------------------------------------------------------- [6.1] Samples ------- The first what you will need to create a module is a 'discrete library' of digitized sounds. The easiest way to get some samples is to save them out of other MODs... .. When you are interested in producing own samples, you should join the news group alt.binaries.sounds.d . ----------------------------------------------------------------- [6.2] Converting Samples ------------------ As far as the composer/editor doesn't understand the format of the samples as they were digitized, you will have to convert them to a format, which can be loaded. * SOX (SOund eXchange) sox4 (sox7 ?) ----------------------------------------------------------------- [6.3] MOD-Editors on an Amiga ----------------------- * NoiseTracker ------------ NoisetrackerV2.0 by Per "Mahoney" Tufvesson & Anders "Kaktus" Berkeman ... * Soundtracker ------------ Soundtracker V2.5 Coded by: Karsten Obarski, Exterminator, TIP, Unknown, MnemoTroN. ... * Protracker ---------- Protracker V2.2 Release A - (C) 1992 Mushroom Studios/Noxious 22/06-1992 Protracker is a Public Domain program, and may may be copied freely and included in any PD library. You may not charge any- thing for the program other than the cost of the disk and the PD-service. ... If you want to contact us for any reason (please do) write to: Or to: Peter "CRAYON" Hanning Anders "DOLPHIN" Ramsay Vinterstigen 12 Fornhojdsvagen 6 II 14440 Ronninge 15158 Sodertalje Sweden Sweden You can also contact us at the Equipoise BBS: +46-755-87404 ----------------------------------------------------------------- [6.4] MOD-Editors on an Atari ----------------------- Lukas Wunner lukas@trillian.tp1.ruhr-uni-bochum.de (134.147.160.21) writes: FTP sites I am referring to: RUS: University of Stuttgart (rusmv1.rus.uni-stuttgart.de / 129.69.1.12) Paderborn: University of Paderborn (athene.uni-paderborn.de / 131.234.2.32) If you have read the section "MOD-Players on an Atari" (see above, chapter 3.2) you already know of the NoiseTracker and Audio Sculpture. The NoiseTracker archive contains an editor, a replay program, a demo, the source code and information on the structure of MODs. Audio Sculpture is more polished than the NST: it is very well presented (maybe written by some demo coders?). However, I have encountered a couple of minor bugs. E.g., it seems that the pro- gram doesn't recognize when you have swapped disks. It is also particularly annoying that the length of the files is always given in octal notation. Another MOD editor is the SoundTracker 2.1. All programs are on RUS (/pub/soft/atari/sound) and on Paderborn (/pcsoft/atari/tools/sound). There are several other editors that are not just ported versions from the Amiga. One is the TCB Tracker. This is a commercial program written by a former demo coder and distributed by MPH in Norwich/England. Demos of the program can be found on various FTP sites. As far as I know, the TCB Tracker's format is incompatible with, say, the NST or the ProTracker format. Another independent program is SMS. This is a shareware tool of German origin. It is similar to the trackers, but it is more a synthesizer (20 KHz, 4 channels) than a sound tracker. SMS has been used for several games (Midimaze 2, Oxyd 1+2, Spacola, etc.). ----------------------------------------------------------------- [6.5] MOD-Editors on a PC ------------------- [6.5.1] plain vanilla DOS ----------------- * MODED (Norman Lin) ----- * DigiStudio (Covox) ---------- DIGI STUDIO V1.5 DEMONSTRATION COPY. (C)1992 THE SPACEPIGS PUBLISHED BY COVOX INTERNATIONAL Plays on: SPEECH THING VOICE/SOUND MASTER SOUND BLASTER INTERNAL SPEAKER OTHER THIS DEMO VERSION HAS MISSING SAVE FUNCTIONS. FOR MORE INFORMATION ON THE FULL DIGISTUDIO PROGRAM CONTACT: COVOX INTERNATIONAL INTL.TEL:(44)983 864674 INTL.FAX:(44)983 867488 * Whacker () ------- .. * Tetra () ----- .. * GTS (?-?-?) --- gts.txt 4071 11-16-92 11:05 gtsfaq.001 4759 11-16-92 11:05 gtsfiles.txt 29076 11-16-92 11:05 gtsinst.bat 603 11-16-92 11:05 gtsmain.zip 111546 11-16-92 11:05 gtssong1.zip 22399 11-16-92 11:07 gtssong2.zip 23137 11-16-92 11:07 gtssam1.zip 184063 11-16-92 11:05 gtssam2.zip 212242 11-16-92 11:06 gtssam3.zip 183165 11-16-92 11:06 gtssam4.zip 319083 11-16-92 11:06 gtssam5.zip 55049 11-16-92 11:06 gtssam6.zip 96742 11-16-92 11:06 gtssam7.zip 413396 11-16-92 7:45 gtssam8.zip 249794 11-16-92 11:06 gtssam9.zip 167170 11-16-92 11:07 gtssam10.zip 196346 11-16-92 11:05 gtssam11.zip 71072 11-16-92 11:05 It seems to be a good program, the first on the PC that uses "real musical notation". But according to the comments of those who where able to download, it might need some "polish". ----------------------------------------------------------------- * 669 --- Renaissance '92 presents Composer 669 v1.1 (c) 1992, Tran The first 8 channel digital composer/player for the PC. Composer 669 is Copyright 1992 by the author Tran (a.k.a. Tomasz Pytel). You are free to distribute the unregistered version of this composer and its documentation in any manner you choose. Composer 669 is an 8 channel digital music composer/player. Thats right, digital. It uses digital samples as instruments in music pieces and mixes the output in real time, 8 channels into 1 on a mono system, and 8 channels into 2 on a stereo system. This results in much higher quality music than FM, and since the music is stored as instruments and notes, it takes up much less space than a full track digital music piece. Things like this have existed before, mostly on Amiga systems, and mostly in 4 channel versions. But lately, the technique of real time digital mixing has found its way to the PC world. This is the first player for the PC that gives you 8 channels to work with. The quality of the music you can create with this composer is very good to approaching professional level. To run this composer you must have the following hardware: 1) A 386 or better computer. 2) 2 megz RAM. (1408k extended). 3) A VGA card. 4) A Sound Blaster or a Sound Blaster Pro sound card. (On an SB you will get mono music, on an SBPro you will get stereo). 5) DOS 3.0 or above. When you run this composer, you must not have any memory ma- nagers or any other programs that run the system in V86 mode, and you must not have DOS loaded high. The best configuration would be a clean system, but you can experiment to see what TSRs and device drivers you can have in memory. Composer 669 was coded entirely by Tran of Renaissance. It runs in 32bit protected mode, using a V86 task to access only the DOS file routines. Composer 669 lets you create and play 8 channel digital mu- sics. Each music can have up to 64 instruments using a maxi- mum of 1408k memory. The max size of each sample (the words instrument and sample will be used interchangably in this doc) is 1 meg. Each music can have up to 128 patterns, a pattern a small chunk of music and it will be explained in more detail later in this doc. Each pattern is made up of 64 rows, each of which can contain a note to be played on each of the 8 channels. Instruments are loaded and saved as pure digital files, and you can also load and save .VOC files as instruments. The composer runs in VGA 80x50 text mode, and I tried to fit as much information as possible onto the screen. You will do almost all your editing on this screen. All the commands in the composer are usually available in 1 keystroke. The mixing and output is done at 12kHz. Renaissance is a small group started in December of 1991. We are basically a music oriented group, but we do games and demos and stuff. We would have released this composer as freeware also, but we need the money. You know, to buy equipment and stuff, and basically for when we do start the company legally... And we feel $20 is a fair price... if you dont think so, dont re- gister it, its your choice... You can reach us on one of our BBSs: The Sound Barrier (718)979-6629, sysop Daredevil This is our home board and main distribution site... The Master Computer (516)437-6749, sysop The Master Com a distribution site for our stuff... Darkfyre's Layr (212)799-5910, sysop Darkfyre a distribution site for our stuff... Our members are: Tran - Coder, some muzik and grafix. C.C.Catch - Great Muzik, ANSI. Mosaic - Muzik, some grafix. RadioIsotope - KILLER GRAFIX & ANSI!!! Daredevil - Distribution, and other misc... Acid Crash - Coder. Thanx go out to all those who helped out testing this thing... ----------------------------------------------------------------- [6.5.2] MS-Windows ---------- Sorry, none seen yet. (HZ) ----------------------------------------------------------------- [6.6] other MOD-Editors ----------------- Sorry, none seen yet. (HZ) ----------------------------------------------------------------- [6.7] Hints on composing ------------------ When you are a beginner, start with a very easy structure. 2/4, 3/4, 4/4, ... pattern break, .. protracker: speed=6 historicals: 12-tone-scales .. choice of instruments .. personal taste ... quantity (length of samples) != quality (rhythm, harmony, ...) (--> rec.music.compose) When you already have some musical experiances, you will 'only' need to learn the handling of the selected MOD-Editor. hex coding, piano roll, musical notation ... ----------------------------------------------------------------- Appendix A [A.1] Some wellknown componists ------------------------- There might be several thousand MOD-writers around the globe. Jim Young alias U4ia ccjy@sun.cse.brist.ac.uk (APATHY=) (all) Mark Brown Maruku/MWatts mjbrown@lonestar.utsa.edu (techno, ?) James Kelly pkk production james.kelly@factory.com (new US-style) . ebbhead prod. setlik@canisius.edu (depeche remixes) . Slampfox ? .. --- Chris H"ulsbeck Sound-Hexer does NOT write MODs, but 7-channel TMFX-files .. ----------------------------------------------------------------- [A.2] Some MODs --------- Because you could fill books with lists of MODs, here you will only find some examples. The files may be named either "mod.long_title" or "SHRTNAME.MOD", but the filename is never a garantee, better look inside the mod. * "nice sounds" (Top 10 wanted?): Rhythm is a Dancer 11/92 (400K-remake by ginseng of alchemy) (900K by snap...) Space_Debris (Captain of Image) Axelf (sev. versions) Turrikan-II-Remix () Take a Trip from Me (U4ia) * Test-Modules for Players: <<<<<< 1993 >>>>>> 12/92 (U4ia) nearly all possible effects used Run-Away-Scales (U4ia) very fast changes of all possible (notes, effects) written to test M.J. Cox' Modplay TechMaru (Maruku of Megawatts) 1st note of 1st pattern: speed 6 in chan- nel 2 and speed $7d in channel 4 (last one should be ignored because out of range, otherwise the MOD sounds toooooooo slow.) ----------------------------------------------------------------- Appendix B [B.1] Related News Groups ------------------- Note: Midi-specific news groups are not (?yet) known here. alt.binaries.sounds.d : Discussion about sounds, sound con- version (sometimes about MODs) alt.binaries.sounds.misc : Sounds themselfs (sometimes MODs) alt.binaries.sounds.music : all types off music files (*): see notes below comp.music : General discussion about music comp.sys.amiga.audio : Discussion about amiga sounds, music, players, editors, ... comp.sys.ibm.pc.soundcard : Discussion about PC-Soundcards, sound conversion (sometimes about MOD-Players) rec.music.compose : Discussion about composition (*): In Jun-93 there was a discussion in a.b.s.d about creating a new news group (e.g. alt.binaries.sounds.), which shall contain the music-files described in this document. 21-Jun-93: According to the last news in a.b.s.d this group shall be called 'alt.binaries.sounds.music' 04-Jul-93: alt.binaries.sounds.music is born Aug-93: a.b.s.mu cannot be accessed by everyone because it has still to be 'newgrouped' by several sysops. Nevertheless we can already find music files therein. ----------------------------------------------------------------- -- >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< zappe@gaea.sietec.de | | |--+- happy Harald Zappe | |/ composing work: +49-30-386-28328/29 / home: +49-30-ASK-ME /___ From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 4/6) Date: 23 Aug 1993 18:30:28 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- Appendix C Internal Structure of Music Files --------------------------------- A lot of people around the world often are asking for the struc- ture of the the various Music Files. As mentioned in the main section of this documentation, there are several different for- mats and 'dialects'. I have tried to collect the structures in the following chapters. The sample file formats (.snd, .au, .voc, ,.wav, SEGM, etc.) are not shown here, because you can get them from the FAQ of alt.binaries.sounds.d (Guido van Rossum: FAQ: Audio File Formats). [C.1] Music Files with synthetic Instruments -------------------------------------- [C.1.1] ROL --- >Newsgroups: comp.music >From: plaiho@vipunen.hut.fi (Pertti V P Laiho) >Subject: Re: ___ ROL format ___ >Organization: Helsinki University of Technology >Date: Sun, 3 Jan 1993 12:18:18 GMT In article <721@vercors.frec.bull.fr> frank@mapd.frec.bull.fr () writes: >Does anyone have the details of .ROL files used by AdLib and compatible >cards on PC? I need it for my Turbo C ROL editor... >Thanx. OK. Here it is... >~From: holmes@mrx.webo.dg.com (Chris Holmes) >~Subject: Adlib .ROL file format >~Date: Wed, 26 Aug 92 12:04:43 GMT I requested this a while back and got a couple of requests for a summary, so here goes: Files containing note information (i.e. songs) are suffixed with ".ROL". ("File version" and "editing scale" are non-musical information used by Visual Composer (TM).) Structure of .ROL files: __________________________________________________________________ fld # size type description (bytes) 1 2 int file version, major 2 2 int file version, minor 3 40 char unused 4 2 int ticks per beat 5 2 int beats per measure 6 2 int editing scale (Y axis) 7 2 int editing scale (X axis) 8 1 char unused 9 1 char 0 = percussive mode 1 = melodic mode 10 90 char unused 11 38 char filler 12 15 char filler 13 4 float basic tempo Field 14 indicates the number of times to repeat fields 15 and 16: 14 2 int number of tempo events 15 2 int time of events, in ticks 16 4 float tempo multiplier (0.01 - 10.0) The remaining fields (17 to 34) are to be repeated for each of 11 voices: 17 15 char filler 18 2 int time (in ticks) of last note +1 Repeat the next two fields (19 and 20) while the summation of field 20 is less than the value of field 18: 19 2 int note number: 0 => silence from 12 to 107 => normal note (you must subtract 60 to obtain the correct value for the sound driver) 20 2 int note duration, in ticks 21 15 char filler Field 22 indicates the number of times to repeat fields 23 to 26: 22 2 int number of instrument events 23 2 int time of events, in ticks 24 9 char instrument name 25 1 char filler 26 2 int unused 27 15 char filler Field 28 indicates the number of times to repeat fields 29 and 30: 28 2 int number of volume events 29 2 int time of events, in ticks 30 4 float volume multiplier (0.0 - 1.0) 31 15 char filler Field 32 indicates the number of times to repeat fields 33 and 34: 32 2 int number of pitch events 33 2 int time of events, in ticks 34 4 float pitch variation (0.0 - 2.0, nominal is 1.0) Notes _____ Fields #1 and #2 should be set to 0 and 4 respectively. Field #10 should be filled with zeros. PS: a 4 byte 'float' in the 80x86 family look like follows: Sign biased -bit exponent significant 31 30..23 22..0 ^ `- here an implicite "1." is assumed exponent bias = 127 (0x7F) eg. 0.5 = 1* 2^(-1) ==> sign=0, exp=127-1, signif=(1.)0000000 10987654 32109876 54321098 76543210 33222222 22221111 11111100 00000000 0 0000000 00000000 00000000 0111111 0 ----------------------------------------------------------------- [C.1.2] CMF --- (all values in hex, big-endian) Header Block Offset 00 char[4] "CTMF" File ID 04 char File Version (minor) 05 char File Version (major) 06 int Offset of Instrument Block 08 int Offset of Music Block From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 5/6) Date: 23 Aug 1993 18:36:16 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- [C.3.0] Music Files with more than 4 Channels ------------------------------------- [C.3.1] GTS - V0.9 ---------- Last modified in Nov.1992 Copyright belongs to the author from when it is made. Name) Kim Young Jae Tel ) (02) 887-9304 Addr) 151-061 Kwan-Ak Gu,Bong-Cheon 11 Dong 1641-5, 18/1 Seoul,Korea Bitnet) 87272039@KRSNUCC1 ----- File Format ----- offset 0 : number of sample offset 1 - offset aaa : sample name(each has 12 byte DOS filename) offset aaa - offset aaa+16 : length of traks(1-8) in words next comes music data, each data has word(2 byte) value. X X X X X X X X X X X X X X X X |_____| |_____| |_| |_________| length type temp note type 0 musical note 1 sample 2 key 3 tempo 4 measure 5 repeat 6 tie 7 ending 8 - 15 reserved for later use. Simple outline routine to read fi = fopen(fn,"rb"); num_sample = fgetc(fi); for(c = 0 ; c < num_sample ; c++) fread(sample_table[c],1,12,fi); fread(length_trak,2,8,fi); for(c = 0 ; c < 8 ; c++) { musicdata[c]=farmalloc(length_trak[c]*2); fread(music_data[c],2,length_trak[c],fi); } fclose(fi); ----- Sample Files ----- * Sample files larger than 64k is truncated. GTS treats samples as unsigned 8-bit raw file of 8000hz. But .VOC(unpacked format) file which has sampling rate in itself can be used by GTS. Other files(.au , .iff) must converted to VOC or 8000hz 8-bit raw file by removing header. ** But Raw file can have special header. RATExx xx is sampling rate of word(2 byte) in 80x86 reverse mode LOOPxxyy xx is begin of loop yy is end of loop Sample file can have either of the 2 informations, or both of them, But the order is RATE first. ex) RATExxLOOPyyzz$$$$$$^^^^^^^^ --> 14 byte is header and real sound data begins from '$' ----------------------------------------------------------------- [C.3.2] 669 - --- 669 file format: offset |length&type |description ------------+---------------+------------------------------------ 0 |1 word |marker, value=0x6669 2 |108 bytes |song message 0x6e |1 byte |NOS = number of samples saved (0-64) 0x6f |1 byte |NOP = number of patterns saved (0-128) 0x70 |1 byte |loop order number 0x71 |0x80 bytes |order list 0xf1 |0x80 bytes |tempo list for patterns 0x171 |0x80 bytes |break location list for patterns 0x1f1 |NOS*size struct|sample data | samp | ---------------------------' |struct samp { | 13 bytes ASCIIZ filename of instrument | 1 dword length of instrument | 1 dword offset of beginning of loop | 1 dword offset of end of loop |} smp[NOS] `---------------------------------------------------------------- 0x1f1+ |NOP*0x600 |patterns (NOS*0x19) | | ---------------------------' |this is repeated 8 times for every row and the array of 8 of | these is repeated 64 times for each pattern. | | bits: | BYTE[0]: BYTE[1]: BYTE[2]: | aaaaaaaa bbbbbbbb cccccccc | \____/\_________________/\__/ \__/\__/ | | | | | | | | | 4 bit volume | command value | | | | | | aabbbb = 6 bit instrument number command: | | 0 = a | note value = (12*oct)+note 1 = b | 2 = c | special values for byte 0: 3 = d | 0xfe = no note, only volume change 4 = e | 0xff = no note or volume change 5 = f | | special value for byte 2: | 0xff = no command | `---------------------------------------------------------------- 0x1f1+ |rest of file |samples (NOS*0x19)+ | | (NOP*0x600) | | ----------------------------------------------------------------- The command values are: a - Portamento up - This command will cause the frequency of the note to increase over time, the command value indicates how fast the pitch will increase. (For those of you who know what this means, the port is linear, not logarithmic). b - Portamento down - Same as 'a' but in the other direction. c - Port to note - This is the only command that requires there to be a note on the same line. This commands sets the note to portamento at the speed defined by the command value to- wards the note on the line. The instrument value of the note is ignored, but the volume is set to the volume in the note on this line. When the note reaches the destination note, the portamento is stopped and it continues playing at the destination note frequency. d - Frequency adjust - This command adjusts the frequency of the note currently playing a little bit. This is useful for when you have 2 notes playing at the same pitch using the same instrument, use this command to adjust the frequency of one of the notes to make it sound a little more harmonic. e - Frequency vibrato - This command sets the frequency of the note that is playing to vibrate. The command value specifies how much to vibrato the note by. Note: A command value of 0 on any of the previous commands cancels the effect of any previous command and sets the note to play normally. f - Set tempo - Usually you will set the tempo for the patterns through their basic tempo. But there are times when you may want to change the tempo within a pattern. Use this command to do it. The tempo will remain at this tempo untill another set tempo command or until another pattern is reached in the order list (even the same pattern that is playing now). ----------------------------------------------------------------- ----------------------------------------------------------------- [C.3.3] Oktalyser --------- (All numbers below are given in hexadecimal) MSB first offset bytes 000000 12t magic "OKTASONGCMOD" 00000C 4 nr of channels (8) 000010 8 ? chan-flags 000018 4 Sample-directory "SAMP" 00001C 4 Sample-dir-len (00000480) (Nr_of_samples = Sample-dir-len / 32) 000020 20t Sample-Name ) 000034 4 ? Sample-len ( up to 36x 000038 4 ? Sample-start > (or more?) 00003C 2 ? (0040) ( 00003E 2 ? (0001) ) .. 0004A0 4 Sample-Pee..? "SPEE" 0004A4 4 spee-len (2) 0004A8 2 spee-value (3) 0004AA 4 Sample-Length "SLEN" 0004B2 4 slen-len (2) 0004B6 2 slen-value (15t) 0004B8 4 Pattern-Length "PLEN" 0004BC 4 plen-len (2) 0004BE 2 plen-value (15t) 0004C0 4 Pattern "PATT" 0004C4 4 nr_of_patterns (128t ?) 0004C8 4 Pattern1 "PBOD" ) 0004CC 4 pbod-len (0702 ( or 0602) > up to 64x 0004CE 2 (64t) ( 0004D0 ... Pattern1-Data ) .. 0..... 4 Sample1 "SBOD" 0..... 4 sbod-len 0..... ... sbod-data 8 bit signed data .. to be continued (HZ) ----------------------------------------------------------------- [C.3.4] IFF FORM TRKR ------------- >From: rog@outb.wimsey.bc.ca (Roger Earl) >Subject: IFF TRKR info part-2 >Date: 20 May 93 00:52:41 PDT Recently some rather brilliant posts by Darren Schebek have popped up on my BBS and the material was just so good and informative that I felt it needed to be shared with the rest of the world. I have Darren's permission, so I am cross-posting some of his messages here and elsewhere. I'll try to forward any responses to Darren, or you can send Internet E-Mail to him at dschebek@wiz.wimsey.bc.ca. .. >From: dschebek@outb.wimsey.bc.ca (Darren Schebek) >Newsgroups: comp.sys.amiga.audio >Subject: IFF FORM TRKR - a brief explanation... >Distribution: world >Message-ID: >Date: 21 May 93 01:45:56 PDT >Organization: Wizard Online Hi. I'm the one whose been working on the IFF FORM TRKR document. Since I'll be losing my usenet access for an underterminate period of time, I'd thought the last thing I could do here is explain myself. :) .. I have been working on this IFF FORM TRKR for almost a year now. I have sent the original draft proposal to Commodore, and they have included it in their latest IFF_FORMS document as a proposal. The current technical specification is in excess of 180K, and is about 70% complete as of this time. I have also written player code that supports the format fully. This code is about 90% written, and still requires debugging and honing. All of the code has been written completely from scratch in assembly language (I even recalculated all lookup tables). I will also be writing load & save routines to go with the player code. All of this code is meant to accompany the IFF FORM TRKR document, and it will be public domain. The player code is very organized, and very well commented. It is also optimized to a point that sustains readability and comprehension. I'm sorry, but I'm just a little tired of seeing player code accompanying some new release of a tracker editor that has the excuse "This code is not optimized in any way" at the top. Such player code is very badly written and completely convoluted. Code that is not optimized is one thing, but code in this state is inexcusable. The player code will support n-octave 8SVX instruments, and will (hopefully, it all looks good on paper) support playing instruments from fast memory as well as chip memory. I have redesigned the structure of a note event. It is still a longword, but now supports 127 note range, up to 63 commands, up to 63 instruments, and contains a 13-bit operand field. This has allowed me to enhance many commands. I will list the commands that FORM TRKR supports here. Upward compatibilty with older tracker file formats is maintained. An existing tracker file that is converted to FORM TRKR can always be converted back to that format. Here are the commands (be aware that this list is unofficial and may change): Arpeggio ( [basenote] [,secondnote] [,thirdnote] [,rate] [,direction] ) Arpeggio II (same as Arpeggio, but restarts the sample. Pitch Slide ( [,signedamount], mode) mode=0 once only, 1=every tick Tone Portamento ( destnote [,rate] ) Tone Portemento II (destnote, progessionmode [,time] ) progressionmode: 0=exponential pitch, 1=linear pitch Tone Portamento + Volume Slide (destnote [,rate] [,signedvolamount] ) Vibrato ( [frequency] [,amplitude] [,wavetype] ) wavetype: 1 = sine wave 2 = ramp up 3 = ramp down 4 = triangle 5 = square wave 6 = noise wave (pseudo-random) Vibrato+Vol. Slide ( [freq] [,wavetype] [signedvolamount] ) Volume Slide ( [signedamount] ) Volume Portamento ( destvolume [,time] ) Tremolo ( [freq] [,amp] [,wavetype] ) wavetype same as vibrato. Set Channel Volume ( volume ) Set Parameters I ( [glissando] [,filter] [,tremoloamp] [,vibratoamp] ) Restart Note ( [initialdelay] [,restartrate] ) Cut-off Note ( [cutoffdelay] ) Set Fine Tune ( finetuneval ) Sample Offset ( offset ) Pause Voice ( time ) Pause Music ( time ) Set Marker ( markerID ) Repeat From Marker ( markerID, numiterations ) Set Ticks Per Minute ( numticks ) Replaces meaningless "BPM" Set Ticks Per Note ( numticks ) Replaces SET SPEED command Set Time Signature ( numerator, denominator ) Set Beats Per Minute ( numbeats ) This is REAL beats per minute. Set Notes Per Beat ( numnotes ) Used with Set Beats Per Minute. Signal Task(s) ( signalcode ) Those, very very briefly are the commands supported so far. I have included commands for defining a beat as well as a time signature so that it may be possible to render FORM TRKR music in sheet music format using standard music notation. FORM TRKR supports n-voice (aka channel) songs. It can be used for songs with any number of voices, from 1 to ??. I would like to state my ambitions here. After completing the technical specification and player code, I intend to write a conversion program for Protracker/Noisetracker and Soundtracker v2.6. Following that, I intend to develop (with a colleague of mine) a FORM TRKR datatype, as well as a fully window-oriented music editor. .. Any comments on this format are welcome. I am losing my usenet access, so please direct comments to Roger (he cross-posted the nine messages). he will make sure I get them. Thank you for reading this. I would lastly like to add that one of the cross-posted messages talks about the problems inherent with portamento the way it's traditionally handled by most (if not all) tracker players. It offers an example of the time taken to complete portamento operations in different octaves using the same notes. Yes, the example given has an incorrect result, but you get the general idea. :) - Darren Schebek ___ passages not relating the format dropped [...] (HZ). ----------------------------------------------------------------- [C.3.5] TFMX 2.0 -------- >From dhollis@cypher.com Mon Jun 7 >Date: Mon, 7 Jun 1993 10:19:02 -0500 (CDT) >From: Dan Hollis THE TFMX PROFESSIONAL 2.0 SONG FILE FORMAT ------------------------------------------ 1. Header --------- The first thing in a TFMX mod is the magic number. "TFMX-SONG ". (Note the trailing space!) After that there is a word which seems to have no real meaning, and you can just leave it 0. The next bit is a long which also has no meaning to the player and can be 0 as well. Following this is 240 bytes which also mean nothing to the player. H"ulsbeck uses these to hold the time and date in ASCII format on 40 character lines. Put what you wish here, or put nothing. It matters naught to the player. After this 256 bytes of information there is a table of 96 words. The first 32 of these are song start positions. The next 32 are song end positions. The last 32 are tempo numbers. If the tempo number is greater than 15, it is used as a beats-per-minute figure, with a beat taking 24 jiffies. If not, then it is used as a divide-by value into a frequency of 50Hz. (0=50Hz, 1=25Hz, 2=16.7 Hz...) At offset $1D0 there is a table of three longs which are offsets into the file. They point to (in this order) the position data, the pattern data pointers, and the instrument data pointers. Nothing else of significance lies within these first 512 bytes. 2. The Position Data -------------------- The position data contains all the sequencing information as far as which patterns get started when. It is an array of 8 word records, one for each track. The high byte of each word contains the position number, or $80 if the last position is to be held, or $FF if the channel is to be disabled, or $FE if a voice is to be stopped. In this last case the low byte holds the voice to stop (0-3), but normally the low byte is a two's-complement number by which the entire track is to be transposed. When any track finishes (with a $F0) it causes the line pointer to increment, and new pattern data is loaded all around. If some pattern finishes before all the rest, and no pattern data is loaded into the other tracks, then they will continue on until they hit a $F0, at which time they will increment the line pointer. This trick can be used to change a rhythm fill in the middle of a track without disrupting the other tracks. When the first word of a line is $EFFE, no track data is loaded. At that point, the entire line is used as a command. The word after $EFFE is used to select a command, and any remaining words are used as parameters to the command. EFFE0000 Stop the player. EFFE0001 Play a section starting at position and ending here times times. If times is 0000 then section will repeat forever. line+4=position, line+6=times EFFE0002 Set the tempo. line+4=divisor, line+6=CIA bpm (-1 if no change) EFFE0003, Start a master volume slide. EFFE0004 line+4=divisor, line+6=target 3. Pattern Data --------------- The longword at $1D4 is an offset to the pattern pointers. The pattern pointers are a series of longword offsets into the file. At each of these offsets begins a pattern. There is a maximum of 128 patterns per song file. Each pattern typically controls one hardware channel, but this is not by any means a requirement. Patterns are a series of longwords. Each longword may be a note or a command. If the longword is a note, it will usually begin between $80-$BF. If the longword is a command it will begin with $F0 or greater. Following is a list of the $F0 commands. (In all listings below, v stands for the voice number 0-F, and all x'es are don't-cares.) F0 xx xx xx END end pattern Ends this pattern and causes the line pointer to advance. F1 aa bb bb RPT repeat block Executes the block of commands starting at bbbb and ending just before this command aa times. If aa is 00, block repeats indefinitely. F2 aa bb bb JMP pattern jump Jumps into pattern aa, at point bbbb. F3 aa xx xx ZZZ rest Waits aa+1 jiffies. F4 xx xx xx CUT disable track Stops the playing of this track. Unrecoverable until a new pattern pointer is loaded. Will not execute any upcoming $F0. F5 xx xv xx REL start release Sets a flag in the appropriate voice. If the instrument program is waiting for a release, this will cause it to continue. Otherwise, it has no effect at all. F6 aa xv bb VIB vibrato See voices command 0C. F7 aa bv cc VSL vol slide Every b+1, slide aa towards cc. F8 aa bb bb JSR call Save current pattern PC, then proceed exactly as in F2. F9 xx xx xx RTS return Restore the saved pattern PC and continue execution. FA aa xx bb FMV fade master volume Every aa, slide the master volume by 1 towards bb. FB bb xa cc JPO jump other track Jump track a to bb with transpose of cc and continue. If the track that this command is on is lower in number than the track being jumped, then the command will take effect at the next entry into the playrout; in any other case, it will be effective immediately. FC aa xv bb POR portamento Every aa, multiplies the current period by (256+bb)/256. FD aa bb bb CUE cue Loads bbbb into cue location aa&3. FE xx xx xx disable trk See F4. FF xx xx xx null Do nothing. Pattern pointer is advanced to the next command. A note is of the form aa bb cv dd. aa is the note number, from 00 to EF. bb is the instrument to use to play the note. c is the relative volume ($F relative = $2D absolute. See command 0D in the instruments.) ee+1 is the time to wait until the next command is executed. Only the lowest 6 bits are significant in note selection. If aa is less than $80, TFMX will immediately fetch another command, and ee will be used as a finetune value (+/- 50%). Also, if aa is greater than $BF, TFMX will portamento from the last note to the one in this command as per the FC command. 4. Instrument Data ------------------ The instrument data is much like the pattern data, i.e. it is a series of longwords pointed to by a table of offsets. However, owing that it has a different purpose and different requirements, a few things are slightly different. Following is a list of the voice commands. (All commands with * can stop the execution of the voice program for one or more jiffies.) 00 aa xx xx STP stop efx and dma * Stops all effects and kills voice. If aa is nonzero, voice is stopped immediately and the next command is executed. If aa is zero, the voice is stopped at the end of the playroutine and the voice sequencer stops for a jiffy. 01 xx xx xx STT start voice Turns on the DMA channel. 02 aa aa aa ADR address long Adds aaaaaa to the beginning of the sample file and loads it into the Paula. 03 xx aa aa LGT set length Loads aaaa into the Paula's length register (one count in aaaa=two bytes) 04 xx aa aa ZZZ wait * Waits aaaa jiffies. 05 aa bb bb RPT repeat section Plays the section from bbbb to here aa times, then continues. 06 aa bb bb JMP jump Jump into instrument aa, starting at point bbbb. 07 xx xx xx END end instrument * Stops this instrument. Not recoverable. 08 aa bb bb SFT set freq by this note * Loads the current note, transposed by aa and by the track transpose if necessary, into the period register. bbbb is a finetune value (0000=100%, 0080=150%, FF80=50%). This command ends instrument processing for this jiffy. 09 aa bb bb SFD set freq direct * Loads note aa, transposed if necessary, into the period register. bbbb is a finetune value. This command ends instrument processing for this jiffy. 0A xx xx xx CLR clear all effects Stops all frequency/pointer vibrato, portamento, and volume slide effects. 0B aa bb bb POR portamento Every aa, multiply the period by (256+bb)/256. If the portamento is not currently running, load the period value in from the current period. 0C aa xx bb VIB vibrato Every jiffy slide by bb. The vibrato waveform starts on the rising zero- crossing of a triangle wave. 2*aa is the period of this waveform. 0D xx xx aa SFV set fine volume Adds aa to the coarse volume (set in the note play command) * 3 and loads it into the volume register. 0E aa xx xx SVO set volume Moves aa into the volume register. 0F aa bb cc VSL vol slide Every bb, slide aa towards cc. 10 aa bb bb RPR repeat x times or until release Acts just like command 05, except if the release signal is received, in which case the loop will be broken. 11 aa bb bb PTS pointer vibrato Each jiffy, for aa jiffies, adds bbbb to the sample pointer. After aa jiffies, the direction is reversed and the cycle begins again, and again, and again, unless aa is 00, in which case bbbb is added to the sample pointer once, at the time of this command, and no other action is taken. 12 xx aa aa RLL relative loop lgth Adds aaaa to the looplength and stores it in the register. 13 aa xx xx SDM stop dma Stops DMA without stopping effects. See 00 above for more. 14 xx xx aa ZZR wait x cycles or until release Wait aa cycles or until release signal is received. If aa is 0, then the wait is indefinite. 15 aa bb bb JSR call instrument Saves instrument PC and jumps to a location. See 06 above. 16 xx xx xx RTS return from call Recalls instrument PC and continues execution. 17 xx aa aa PER absolute period * Loads aaaa into the period register. This command ends sound processing for this jiffy. 18 aa aa aa SLS set loop start Adds aaaaaa to the sample start and subtracts aaaaaa from the sample length. 19 xx xx xx NUL load null sample Loads the null sample into the appropriate registers. 1A xx aa aa RSM repeat sample Plays the sample aaaa times, then continues with the next instruction. 1B \ 1C /_ repeat section (see 05) 1D \ 1E / 1F aa bb bb SFL set freq by last note * Loads the last note, transposed by aa and by the track transpose if necessary, into the period register. bbbb is a finetune value (0000=100%, 0080=150%, FF80=50%). This command ends sound processing for this jiffy. 20 aa bb bb CUE cueing Loads bbbb into cueing register (aa&3). 21 xx xx xx RTG retrig Restarts the current note immediately. 22 through 2A are used in the TFMX player found in Turrican II. I have no clue WHAT these do, but as they were only used in one T2 song (song 9, which isn't even played during the game), I didn't press too hard. 5. The Stock TFMX Player ------------------------ tfmx_base bra tfmx_initplyr bra tfmx_player bra tfmx_initplyr bra tfmx_startsong bra tfmx_donote bra tfmx_initmodl bra tfmx_initplyr bra tfmx_installplyr bra tfmx_stopnote bra tfmx_startsong bra tfmx_makefade bra tfmx_cuedataadr bra tfmx_initplyr bra tfmx_initplyr bra tfmx_initplyr bra tfmx_initplyr bra tfmx_holdsong bra tfmx_initplyr bra tfmx_initplyr bra tfmx_initplyr bra tfmx_initplyr bra tfmx_setupframerate bra tfmx_initplyr bra tfmx_initplyr bra tfmx_initplyr TFMX includes a limited cueing facility in which the player can set bytes up for use by an external program. Calling tfmx_base+$2C will give you the base address of the cueing area. Following is a list of all bytes used by the player in this area: $offset size function 00 w nonzero = master volume fade is in progress 15 b A line has been fetched. Master program must set to 0 when any processing has been finished. 1E w Cue word 0. 20 w Cue word 1. 22 w Cue word 2. 24 w Cue word 3. 6. Credit Where Credit Is Due ----------------------------- TFMX is a product of Chris H"ulsbeck for use exclusively in games for which he wrote music, and is probably a registered trademark under the Berne copyright convention too. But I've not seen anything about this, so... Thanks go out to Chris H"ulsbeck for creating a song format that isn't based on a drum machine. Thanks to STratoHACKster for letting me use his Amiga and ReSource to hack TFMX. Thanks to Whiplash for net access... a-HEM! Password, please? Cheers. -/\/\ /\/\ ----------------------------------------------------------------- [C.3.6] Studio Session Format --------------------- >From: jamal@bronze.lcs.mit.edu (Jamal Hannah) >Subject: Mac Music Info Sheet (Finished!) THE STUDIO SESSION SONG FILE FORMAT (Editor version 1.0) -------------------------------------------------------- Format created by: Steve Capps , Mark Zimmer, Tom Hedges, Ed Bogas, Nick Borelli, Ty Roberts, and Neil Cormia of Bogas Software in 1986. This hacked description by: Jamal Hannah There are 12 fields and 6 tracks to this format.. on old Macs, since you use complex waveforms for these sounds, you'll probabaly have to simulate the multiple sound channels by combining them on the fly with some fancy math. I think there is actualy a Mac Toolbox call to do this in the origional "Sound Driver" chapter of Inside Macintosh. File Signatures (Macintosh Only) Type: 'XSNG' (sometimes 'DSNG') Creator: 'XPRT' Offset Field Length 0 Tempo 2 range: 10-450 2 unused 2 should be nul ($0000) 4 TimeSignature 2 decimal ranges of each byte: 1-32,1-32 6 Pascal string names of Instrument Files begin here, each followed by 2 nul bytes. ($00 $00) ?? unused 1 (should be $00.. if there are no instruments, this will come right after TimeSignature) ?? unused 64 ?? Data for track 1, terminated by $B0 ?? Data for track 2, terminated by $B0 ?? Track 3 " ?? Track 4 " ?? Track 5 " ?? Track 6 " Instruments are numbered from 01 onward, starting with the first one listed. They are the exact name of the Studio Session Instrument file, which should be on the same volume or directory. Track data consists of the following commands, which represent notes and other components on a musical staff: COMMANDS (with field names): ending $C0 xx (endingNumber) timeSignature $BD xx xx (timeSigTop,timeSigBottom) barLine $BA newInstrument $B9 xxxx (instrumentNumber) dashedBarLine $B5 keySignature $B4 xx (keyMode) tempoChange $B3 xxxx (tempoSpeed) repeatBarEnd $B2 repeatBarStart $B1 xxxx (numRepeats) coda $B0 musicalNote xx xx xx (pitch, unit#, slurStatus) NOTE UNITS: (a "musicalNote" is really either a rest, or a note. Normaly a unit is a rest, but if it has anything in the pitch field (mentioned above) then it is a note. A rest always has $00 in the pitch and slurStatus fields. unit32 $03 1/32nd rest or note unit32_3 $02 1/32nd rest or note triplet unit32_2 none unit32_1 none unit16 $06 1/16th rest or note unit16_3 $04 1/16th rest or note triplet unit16_2 none unit16_1 $09 1/16th rest or note, dotted unit8 $0C 1/8th rest or note unit8_3 $08 1/8th rest or note triplet unit8_2 $15 1/8th rest or note, double-dotted unit8_1 $12 1/8th rest or note, dotted unit4 $18 1/4th rest or note unit4_3 $10 1/4th rest or note triplet unit4_2 $2A 1/4th rest or note, double-dotted unit4_1 $24 1/4th rest or note, dotted unit2 $30 1/2 rest or note unit2_3 $20 1/2 rest or note triplet unit2_2 $54 1/2 rest or note, double-dotted unit2_1 $48 1/2 rest or note, dotted unit1 $60 Whole rest or note unit1_3 $40 Whole rest or note, triplet unit1_2 $A8 Whole rest or note, double-dotted unit1_1 $90 Whole rest or note, dotted (A triplet is a rest/note with a little 3 over it, with playing length multiplied by 2/3 (shortened). A double-dotted unit's length is multiplied by 1 3/4, and a single dotted unit length is multiplied by 1 1/2... if I am wrong, a good book on musical notation can clear this up!) PITCH: Pitch values range from "C0" (lower C, at the bottom of the scale) up to "C6" (upper C, at the top of the scale).. and are represented by the numbers $01-$2B (1-43). If this value has $40 added to it, then it is "flat". If it is "sharp", it has $80 added. SLUR STATUS: The slur is that little curvy line that links two notes together and "slurs" them together at playtime. Here are the byte values: $00 No slur on this note $01 Slur start/line curving from this note toward one on the right $02 Slur end/line coming from a note to the left $03 Slur joint (two slur lines coming from both left and right) BAR LINE: This byte represents the vertical bar line that marks the end of a measure. I'm not sure what a dashed bar line is for! ENDING: An "ending" command is followed by the number that the ending is repeated, ranging from 1-10 ($01-$0A) REPEAT BAR: The Command byte is followed by a word-length number representing the number of times to repeat the following notes. The repeated section is terminated by the next instance of a "repeatBarEnd" command. TIME SIGNATURE: The "timeSignature" command is followed by bytes representing the top and bottom of the time signature, respectivly. KEY SIGNATURE: The key signature command is followed by codes representing the following modes of the notes that follow: Value Key Number to add to pitch-bytes of notes following $00 C Major $00 $01 G Major $00 $02 D Major $80 $03 A Major $80 $04 E Major $80 $05 B Major $80 $06 F Sharp Major $80 $07 C Sharp $80 $08 F $00 $09 B flat $00 $0A E flat $00 $0B A flat $00 $0C D flat $00 $0D G flat $40 (note: dont add this value if the note already has a sharp or a flat) TEMPO CHANGE: A tempo change command byte is followed by a word-length value representing the new tempo speed, ranging (in decimal) from 10-450. CODA A coda is a byte representing the end of a track and the file itself should end with one. If a track is empty, the coda byte holds it's place. Send all additions/corrections to: jamal@gnu.ai.mit.edu ----------------------------------------------------------------- -- >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< zappe@gaea.sietec.de | | |--+- happy Harald Zappe | |/ composing work: +49-30-386-28328/29 / home: +49-30-ASK-ME /___ From: zappe@gaea.sietec.de (Harald Zappe) Subject: FAQ: Music File Formats (part 6/6) Date: 23 Aug 1993 18:37:44 GMT >State: first public release (beta) >Version: V0.00b >Date: 22-Aug-1993 Harald Zappe zappe@gaea.sietec.de (141.73.4.121) zappe@sony1.sietec.de (220.255.4.245) zappe@mikro.ee.tu-berlin.de (130.149.136.2) (and others, HZ) ----------------------------------------------------------------- [C.4] Hybrid Music Files ------------------ These types of music files contain both, synthetic and sampled instruments. [C.4.1] OctaMed ------- ----------------------------------------------------------------------------- MED/OctaMED MMD0 and MMD1 file formats written by Teijo Kinnunen (25.4.1992) Revision 1 ----------------------------------------------------------------------------- Background ---------- A couple of years ago, when programming MED V2.1, I needed a file format for MED modules. The only "module" format in MED V2.0 was the Sng+samples format. Although it produced compact files, it was very difficult and tricky to read in. Therefore, I designed a new file format, that would be easy to use in module player programs etc. This file format was named 'MMD0' (Med MoDule 0). The limitations in MMD0 block format forced me to create a new file format for OctaMED Professional, this format is 'MMD1'. It's mostly the same as MMD0, except the block structure is different. At the time of this writing (when OctaMED Pro is not even released yet), MMD0's are absolutely more common than MMD1's. Design concepts --------------- One of the main goals was to make MMD's (MED modules) as extensible as possible. This would have been easy to implement with IFF-style chunks. However, this method is obviously not the best for play-routine use. Therefore, MMD's are implemented in quite an extraordinary way. They consist of structures (similar to C structs), and pointers. In a module file, pointers are defined as offsets from the beginning of the module. This way, a particular structure can be read just by Seek()'ing using the pointer as the offset from the beginning of the file. When a module has been read into memory, it has to be relocated before it can be used (the relocation is done simply by adding the address of the module to the pointers). As with the Amiga OS, a MMD file does not contain absolute addresses. There's a module header structure at the beginning of the file. This structure contains pointers to different parts of the module. And you *MUST* use these pointers. You may NOT expect that the song structure is at offset $00000034, for example. Although it usually is, this may change in future releases. In addition, it's possible that a structure even doesn't exist (the structure pointer is NULL). Therefore, you *MUST* check the structure pointer before accessing the structure. Finally, when writing MMD's you *MUST* set undefined/reserved fields to zeros. More finally, you *MUST* align all structures to even boundaries! (I forgot the alignment in MED V3.00 save routine, resulting Guruing modules under some conditions :-( The module header ----------------- This structure must exist at the beginning of each MED module file. Each of the structure members are described below. In multi-modules, there are header structs for each song. (The subsequent header pointers can be found from expdata structure. Multi-modules should have the same smplarr pointer in every header.) Older MEDs which don't recognize multi-modules consider a multi-module as an ordinary module (only the first song is loaded). The numbers enclosed in /* */ at the beginning of each line are (decimal) offsets of each member (for assembly programmers). ----------------------------------------------------------------------------- struct MMD0 { /* 0 */ ULONG id; /* 4 */ ULONG modlen; /* 8 */ struct MMD0song *song; /* 12 */ ULONG reserved0; /* 16 */ struct MMD0Block **blockarr; /* 20 */ ULONG reserved1; /* 24 */ struct InstrHdr **smplarr; /* 28 */ ULONG reserved2; /* 32 */ struct MMD0exp *expdata; /* 36 */ ULONG reserved3; /* 40 */ UWORD pstate; /* some data for the player routine */ /* 42 */ UWORD pblock; /* 44 */ UWORD pline; /* 46 */ UWORD pseqnum; /* 48 */ WORD actplayline; /* 50 */ UBYTE counter; /* 51 */ UBYTE extra_songs; /* number of songs - 1 */ }; /* length = 52 bytes */ ----------------------------------------------------------------------------- id -- This longword is used to identify the MMD and its version. Currently defined MMD types are MMD0 (0x4D4D4430) and MMD1 (0x4D4D4431). MMD2 and upwards are reserved for future versions. In multi-modules, the following modules usually contain id MCNT, or MCN1. The first module always has MMD0 or MMD1 as an id. modlen ------ This longword contains the length of the entire module. song ---- Pointer to a MMD0song structure. This structure MUST ALWAYS EXIST! blockarr -------- Pointer to a table of block pointers. For example: blockarr: $00003000 block 0 ptr block 1 ptr block 2 ptr offset $00003000: $00002000, $00002400, $00002800 .... offset $00002000: block 0 data... offset $00002400: block 1 data... .. The size of the table is MMD0song.numblocks longwords. smplarr ------- Pointer to a table of instrument pointers. The size of the table is MMD0song.songlen longwords. This pointer is zero in OctaMED Pro MMD1 songs. In this case, OctaMED Pro loads the instruments from disk(s). expdata ------- Pointer to an expansion structure. The expansion structure contains a lot of extra information. The exp. structure does not exist in all MMD's. (Be sure to check the pointer before using it.) pstate, pblock, pline, pseqnum, actplayline, counter ---------------------------------------------------- These are variables for the play routine. You can read these fields to get the current song position (not all versions of the play routine use these fields, however). When writing a MMD, you should leave all fields to zero, except the 'actplayline', which ought to be -1 ($FFFF). extra_songs ----------- This field contains the number of songs in the current module. For non-multi-modules, this is 0. If there are two songs, extra_songs contains 1, and so on. reserved0,1,2,3 --------------- Not currently defined. Set to zero. The song structure (MMD0song) ----------------------------- This structure contains the basic information about the song. It must exist on every module file. ----------------------------------------------------------------------------- struct MMD0song { struct MMD0sample sample[63]; /* 63 * 8 bytes = 504 bytes */ UWORD numblocks; /* offs: 504 */ UWORD songlen; /* offs: 506 */ UBYTE playseq[256]; /* offs: 508 */ UWORD deftempo; /* offs: 764 */ BYTE playtransp; /* offs: 766 */ UBYTE flags; /* offs: 767 */ UBYTE flags2; /* offs: 768 */ UBYTE tempo2; /* offs: 769 */ UBYTE trkvol[16]; /* offs: 770 */ UBYTE mastervol; /* offs: 786 */ UBYTE numsamples; /* offs: 787 */ }; /* length = 788 bytes */ ----------------------------------------------------------------------------- sample ------ Contains some basic info about each sample. The structure looks like this: ----------------------------------------------------------------------------- struct MMD0sample { UWORD rep,replen; /* offs: 0(s), 2(s) */ UBYTE midich; /* offs: 4(s) */ UBYTE midipreset; /* offs: 5(s) */ UBYTE svol; /* offs: 6(s) */ BYTE strans; /* offs: 7(s) */ }; ----------------------------------------------------------------------------- rep repeat start offset, shifted right one bit (as in Protracker). replen repeat length, shifted right one bit. midich MIDI channel for current instrument, 0 if not MIDI. midipreset MIDI preset number for current instrument, 0 if no preset. svol default volume for current instrument (0 - 64). strans instrument transpose value. More information is defined in expdata structure. numblocks --------- Number of blocks in current song. This field also indicates the length of the blockarr table in longwords. songlen ------- Song length (number of sequence numbers in the play sequence list). playseq ------- This is the play sequence list. deftempo -------- Default song tempo (the leftmost tempo slider in MED/OctaMED). If BPM mode is on, this value indicates BPM. playtransp ---------- The global play transpose value for current song. flags ----- Contains many single-bit flags: FLAG_FILTERON 0x1 the hardware audio filter is on FLAG_JUMPINGON 0x2 mouse pointer jumping on (not in OctaMED Pro) FLAG_JUMP8TH 0x4 jump every 8th line (not in OctaMED Pro) FLAG_INSTRSATT 0x8 sng+samples indicator (not useful in MMD's) FLAG_VOLHEX 0x10 volumes are HEX FLAG_STSLIDE 0x20 use ST/NT/PT compatible sliding FLAG_8CHANNEL 0x40 this is OctaMED 5-8 channel song (bit 0x80 is not defined, and must be set to zero) flags2 ------ More flags, currently only BPM stuff: FLAG2_BMASK 0x1F (bits 0-4) BPM beat length (in lines) 0 = 1 line, $1F = 32 lines. (The rightmost slider in OctaMED Pro BPM mode.) FLAG2_BPM 0x20 BPM mode on (bits 0x40 and 0x80 are not defined, and must be set to zero) tempo2 ------ This is the "secondary tempo" (the rightmost MED/OctaMED tempo slider), indicating the number of timing pulses per line. trkvol[16] ---------- The relative track volumes (1 - 64) for each track. mastervol --------- The relative master volume (1 - 64). numsamples ---------- Number of instruments (samples/synthsounds) in current song. Also indicates the size of the smplarr table in longwords. The block format ---------------- As described above, MMD0 header structure contains a pointer (blockarr) to a table of block pointers. These block pointers point to the actual block data structures. The format of these data structures differ in MMD0 and MMD1 file formats. MMD0 block format ----------------- At the beginning of each block, there's a small header: ----------------------------------------------------------------------------- struct MMD0Block { UBYTE numtracks,lines; }; ----------------------------------------------------------------------------- numtracks number of tracks (4, 8, 12 or 16) on this block lines number of lines on this block; 0 = 1 line, 255 = 256 lines Following this header, there is the actual note data, consisting of 3-byte structures containing a note and its command. The data is arranged sequentially a line at a time, i.e. in the following order: line 0 track 0 line 0 track 1 line 0 track 2 line 0 track 3 line 1 track 0 line 1 track 1 ... The 3-byte structure looks like this (each letter corresponds to one bit): xynnnnnn iiiicccc dddddddd n = note number (0 - $3F). 0 = ---, 1 = C-1, 2 = C#1... i = the low 4 bits of the instrument number x = the 5th bit (#4) of the instrument number y = the 6th bit (#5) of the instrument number c = command number (0 - $F) d = databyte ($00 - $FF) MMD1 block format ----------------- MMD1 block format can contain a lot more information than MMD0's. The block header looks like this: ----------------------------------------------------------------------------- struct MMD1Block { UWORD numtracks; UWORD lines; struct BlockInfo *info; }; ----------------------------------------------------------------------------- numtracks Number of tracks in this block (4, 8, 12, or 16). lines Number of lines in this block (0 = 1 line etc.). OctaMED Pro can handle upto 3200 lines/block, so this is obviously the practical upper limit. info Pointer to structure containing extra information. (Can be NULL, if no BlockInfo struct exists). The BlockInfo structure is: ----------------------------------------------------------------------------- struct BlockInfo { ULONG *hlmask; UBYTE *blockname; ULONG blocknamelen; ULONG reserved[6]; }; ----------------------------------------------------------------------------- hlmask Pointer to an array of longwords, containing info about line highlighting (TAB key on MED). The number of longwords depend on the number of lines on the block. (E.g: 1 line -> 1 longword, 32 lines -> 1 lw, 33 lines -> 2 lws, 256 lines -> 4 lws) The bits in the longwords are arranged in reversed order (e.g. bit #0 = line 0, bit #31 = line 31). blockname Pointer to the name of the block. Must be null- terminated. blocknamelen Length of the block name, including the terminating zero. OctaMED Pro currently has the maximum length of 41 chars (+ zero). However, this may change in the future. Don't read blocknames longer than you are able to handle! reserved[6] These are reserved for future extensions. Must be set to zero. The note structures, which are 4 bytes long in MMD1 modules, are arranged exactly as in MMD0 modules. xnnnnnnn xxiiiiii cccccccc dddddddd n = note number (0 - $7F, 0 = ---, 1 = C-1...) i = instrument number (0 - $3F) c = command ($00 - $FF) d = databyte ($00 - $FF) x = undefined, reserved for future expansion. MUST BE SET TO ZERO, AND MASKED OUT WHEN READING THE NOTE OR INSTRUMENT NUMBER. The instrument format --------------------- The MMD0 header structure contains a pointer (smplarr) to a table of instrument pointers. These pointers point to the actual instrument data structures. If an instrument pointer is zero, there's no instrument in that slot. Every instrument has a six-byte header structure, which is the same for all instrument types (sample/synth/hybrid). ----------------------------------------------------------------------------- struct InstrHdr { ULONG length; WORD type; /* Followed by actual data */ }; ----------------------------------------------------------------------------- length indicates the length of the instrument (the six byte header data length is not included) type instrument type - currently the following types are defined: HYBRID -2 SYNTHETIC -1 SAMPLE 0 (an ordinary 1-octave sample) IFF5OCT 1 (5 octaves) IFF3OCT 2 (3 octaves) (The following ones are recognized by OctaMED Pro only) IFF2OCT 3 (2 octaves) IFF4OCT 4 (4 octaves) IFF6OCT 5 (6 octaves) IFF7OCT 6 (7 octaves) The sample-type instruments (>= 0) contain the actual sample data straight after the header structure. Synthetic instruments --------------------- Synthsounds have a special structure of their own. They also contain waveforms and pointers to them. Therefore, relocation is required. However, there's an important difference: pointers are expressed as an offset from the beginning of the synthsound, NOT the beginning of the module. The 'reloc.a' routine provided with MED/OctaMED automatically handles this. The synthsound structure is as follows (note that this structure contains the header structure): ----------------------------------------------------------------------------- struct SynthInstr { ULONG length; /* length of this struct */ WORD type; /* -1 or -2 (offs: 4) */ UBYTE defaultdecay; UBYTE reserved[3]; UWORD rep; UWORD replen; UWORD voltbllen; /* offs: 14 */ UWORD wftbllen; /* offs: 16 */ UBYTE volspeed; /* offs: 18 */ UBYTE wfspeed; /* offs: 19 */ UWORD wforms; /* offs: 20 */ UBYTE voltbl[128]; /* offs: 22 */ UBYTE wftbl[128]; /* offs: 150 */ struct SynthWF *wf[64]; /* offs: 278 */ }; ----------------------------------------------------------------------------- defaultdecay = the default decay of the current synthsound. This is NOT used in modules. It's significant only when saving a single synthsound. reserved[3] = set to zero. rep, replen = repeat/rep. length for hybrid sounds. Used only when saving a single hybrid sound. voltbllen = the length of the volume sequence table. wftbllen = the length of the waveform sequence table. volspeed = the initial volume table execution speed. wfspeed = the initial waveform table execution speed. wforms = the number of waveforms in the current synthsound. voltbl = the actual volume sequence table. Values $00-$7F are volumes or command arguments. Values >= $80 are commands. The following commands are currently defined: $FF END $F4 EN1 $FE JMP $F3 CHU $FB HLT $F2 CHD $FA JWS $F1 WAI $F6 EST $F0 SPD $F5 EN2 wftbl = the actual waveform sequence table. Values $00-$7F are waveform numbers or command arguments. Values >= $80 are commands. The following commands are currently defined: $FF END $F6 RES $FE JMP $F5 VBS $FD ARE $F4 VBD $FC ARP $F3 CHU $FB HLT $F2 CHD $FA JVS $F1 WAI $F7 VWF $F0 SPD wf = pointers to waveforms. (Once again: relative to the beginning of the synthsound!) A waveform structure is as follows: struct SynthWF { UWORD length; /* length in words */ BYTE wfdata[xx]; /* the waveform */ }; (where xx = length in bytes) In hybrid sounds, however, wf[0] is different. Hybrid instruments ------------------ Hybrid sounds use the same structure as synthsounds, except that the first waveform (wf[0]) pointer points to a sample. (The sample header structure exists, as usual.) MMD0exp - the key to future expansions -------------------------------------- For possible future expansions, I designed a structure for carrying the miscellaneous things that were added to MED/OctaMED now and then. (MED V3.00 was the first version, which wrote this structure.) Most of its fields are in use now, but it's possible to even expand this structure (things will get a bit more tricky, though). In multi-modules, you should extract all data from the expansion structure of the first song. The only exceptions are currently the 'nextmod' and 'songname' fields, which are song-specific. Also, there has been need for extending the MMD0sample structure. Both InstrExt and MMDInstrInfo provide extra information about the instruments. These are defined as structure arrays (exp_smp and iinfo point to the first structure). The extension structures don't have a constant size, instead you have to read s_ext_entrsz or i_ext_entrsz to get the structure sizes. When reading, you have to check the entrsz fields to see which structure members do exist. The difference between InstrExt and MMDInstrInfo is that InstrExt contains information the play-routine is interested in (e.g. finetune). MMDInstrInfo contains "secondary" information, which is of no use to the player routine (e.g. instrument name). The expansion structure follows: ----------------------------------------------------------------------------- struct MMD0exp { struct MMD0 *nextmod; struct InstrExt *exp_smp; UWORD s_ext_entries; UWORD s_ext_entrsz; UBYTE *annotxt; ULONG annolen; struct MMDInstrInfo *iinfo; UWORD i_ext_entries; UWORD i_ext_entrsz; ULONG jumpmask; UWORD *rgbtable; UBYTE channelsplit[4]; struct NotationInfo *n_info; UBYTE *songname; ULONG songnamelen; struct MMDDumpData *dumps; ULONG reserved2[7]; }; ----------------------------------------------------------------------------- nextmod = pointer to the next module (or zero). (Only used in multi-modules!) exp_smp = pointer to InstrExt. Currently the first four bytes of InstrExt have been defined: struct InstrExt { UBYTE hold; UBYTE decay; UBYTE suppress_midi_off; BYTE finetune; }; hold, decay = hold/decay values of the instrument suppress_midi_off = 0 (FALSE) or not (TRUE) finetune = instrument finetune (-8-+7) s_ext_entries = the size of InstrExt structure array (i.e. the number of InstrExt structures). s_ext_entrsz = the size of each InstrExt structure (in bytes). annotxt = pointer to the annotation text (null-terminated). annolen = length of 'annotxt', including the terminating \0. iinfo = pointer to MMDInstrInfo. Currently the first forty bytes have been defined: struct MMDInstrInfo { UBYTE name[40]; }; name = null-terminated instrument name i_ext_entries = the size of the MMDInstrInfo struct array (i.e. the number of MMDInstrInfo structures). i_ext_entrsz = the size of each MMDInstrInfo struct in bytes. jumpmask = a mask controlling which instruments cause the mouse pointer to jump. E.g. bit #1 = instr. #1. This field has become obsolete in OctaMED Pro. rgbtable = pointer to eight UWORDs (screen colors) to be passed to LoadRGB4() routine. channelsplit = this longword is divided to four boolean bytes, controlling channel splitting in OctaMED 5 - 8 chnl modes. (A non-zero byte means that the channel is NOT splitted.) Currently only the following combinations should be used: 0x00000000 (8 channels (or normal 4 channel mode)) 0x000000FF (7 channels) 0x0000FFFF (6 channels) 0x00FFFFFF (5 channels) n_info = pointer to NotationInfo structure (used only in OctaMED V2.0 and later). It contains some info for the notation editor. struct NotationInfo { UBYTE n_of_sharps; UBYTE flags; WORD trksel[5]; UBYTE trkshow[16]; UBYTE trkghost[16]; BYTE notetr[63]; UBYTE pad; }; n_of_sharps = number of sharps or flats (0 - 6) flags = misc. bits, these are defined: NFLG_FLAT 1 (= use flats instead of sharps) NFLG_3_4 2 (= display 12 lines instead of 16) trksel = the number of the selected track, for each display preset (-1 = no track selected) trkshow = tracks shown (five bits used in each byte, bit #0 = preset 1, etc.) trkghost = tracks ghosted (as in 'trkshow') notetr = note transpose value for each instrument (-24 - +24). If bit 6 is negated, the instrument is hidden. pad = possibly holding info about struct expansions in the future. Don't touch! songname = song name of the current song (0-terminated). Each song of a multi-module can have a different name. songnamelen = song name length (including the terminating zero). dumps = MIDI dump data (created using OctaMED Pro MIDI message editor). The 'dumps' field points to the following struct: struct MMDDumpData { UWORD numdumps; UWORD reserved[3]; }; Immediately after this struct, there are 'numdumps' pointers to the following struct: struct MMDDump { ULONG length; UBYTE *data; UWORD ext_len; /* if ext_len >= 20: */ UBYTE name[20]; }; length = length of the MIDI message dump. data = pointer to the actual MIDI dump data. ext_len = MMDDump struct extension length. For flexible future expansion. (if ext_len >= 20, the following fields exist) name = name of the dump. reserved2 = future expansion fields, that MUST be zero now. ----------------------------------------------------------------------------- Finally, here is a collection of the most important rules you should obey when handling MMD's: * ALWAYS USE POINTERS, NOT ABSOLUTE OFFSETS. * CHECK THAT A POINTER IS NONZERO BEFORE ACCESSING ANYTHING IT POINTS TO. * WHEN WRITING, SET UNDEFINED/RESERVED BITS AND BYTES TO ZERO. WHEN READING, MASK OUT UNDEFINED BITS, AND DON'T USE UNDEFINED FIELDS. * WHEN WRITING, ALWAYS ALIGN EVERYTHING TO EVEN BOUNDARIES. * WHEN WRITING, ALWAYS WRITE THE SONG STRUCTURE. * REMEMBER TO HANDLE ERROR SITUATIONS CORRECTLY (IN ALL PROGRAMS, NOT ONLY WHEN HANDLING MMDs ;^) If you don't understand some part of this file completely, try saving a module using MED, and then examine the file with a file editor. This way you can learn easily about the file format of MED/OctaMED. ----------------------------------------------------------------------------- I hope this document will help programmers who wish to be able to handle modules in their programs. NOTE! This text file is PUBLIC DOMAIN. All distribution of this file,via the pd is strongly encouraged. Thank you! Teijo Kinnunen Oksantie 19 SF-86300 OULAINEN FINLAND ---------------------------------------------------------------------------- ----------------------------------------------------------------- [C.4.2] MIDI ---- >From: johnj@echo.philips.nl (John Janssen) >Newsgroups: alt.sb.programmer,comp.os.ms-windows.programmer.misc >Subject: Re: wanted MIDI File Standard >Keywords: MIDI, File Format >Date: 25 Sep 92 12:42:04 GMT >Organization: Digital Equipment Corporation, E.C.H.O. development department As the question for the MIDIFILE specs has been done quite often lately, I am posting something I got from the net as well. It includes it all, although it might be tough reading. John =----------------------------------8<-------------------------------- [This document is Dave Oppenheim's current version of the MIDI file specification, as sent to those who have participated in its development. The consensus seems to be to submit this to the MIDI Manufacturers' Association as version 1.0. I apologize for any loss of clarity that might have occurred in the conversion from a Microsoft Word document to this pure text file. I have removed some of the discussion about recent changes to the specification in order to keep the file size reasonable.--Doug Wyatt] Standard MIDI Files 0.06 March 1, 1988 0 Introduction This describes a proposed standard MIDI file format. MIDI files contain one or more MIDI streams, with time information for each event. Song, sequence, and track structures, tempo and time signature information, are all supported. Track names and other descriptive information may be stored with the MIDI data. This format supports multiple tracks and multiple sequences so that if the user of a program which supports multiple tracks intends to move a file to another one, this format can allow that to happen. This spec defines the 8-bit binary data stream used in the file. The data can be stored in a binary file, nibbleized, 7-bit-ized for efficient MIDI transmission, converted to Hex ASCII, or translated symbolically to a printable text file. This spec addresses what's in the 8-bit stream. 1 Sequences, Tracks, Chunks: File Block Structure Sequence files are made up of chunks. Each chunk has a 4-character type and a 32-bit length, which is the number of bytes in the chunk. On the Macintosh, data is passed either in the data fork of a file, or on the Clipboard. (The file type on the Macintosh for a file in this format will be "Midi".) On any other computer, the data is simply the contents of the file. This structure allows future chunk types to be designed which may easily be ignored if encountered by a program written before the chunk type is introduced. Your programs should expect alien chunks and treat them as if they weren't there. This proposal defines two types of chunks: a header chunk and a track chunk. A header chunk provides a minimal amount of information pertaining to the entire MIDI file. A track chunk contains a sequential stream of MIDI data which may contain information for up to 16 MIDI channels. The concepts of multiple tracks, multiple MIDI outputs, patterns, sequences, and songs may all be implemented using several track chunks. A MIDI file always starts with a header chunk, and is followed by one or more track chunks. MThd
MTrk MTrk ... Track Data Format (MTrk chunk type) The MTrk chunk type is where actual song data is stored. It is simply a stream of MIDI events (and non-MIDI events), preceded by delta-time values. Some numbers in MTrk chunks are represented in a form called a variable- length quantity. These numbers are represented 7 bits per byte, most significant bits first. All bytes except the last have bit 7 set, and the last byte has bit 7 clear. If the number is between 0 and 127, it is thus represented exactly as one byte. Here are some examples of numbers represented as variable-length quantities: Number (hex) Representation (hex) 00000000 00 00000040 40 0000007F 7F 00000080 81 00 00002000 C0 00 00003FFF FF 7F 00004000 81 80 00 00100000 C0 80 00 001FFFFF FF FF 7F 00200000 81 80 80 00 08000000 C0 80 80 00 0FFFFFFF FF FF FF 7F The largest number which is allowed is 0FFFFFFF so that the variable- length representation must fit in 32 bits in a routine to write variable-length numbers. Theoretically, larger numbers are possible, but 2 x 108 96ths of a beat at a fast tempo of 500 beats per minute is four days, long enough for any delta-time! Here is the syntax of an MTrk chunk: = + = is stored as a variable-length quantity. It represents the amount of time before the following event. If the first event in a track occurs at the very beginning of a track, or if two events occur simultaneously, a delta-time of zero is used. Delta-times are always present. (Not storing delta-times of 0 requires at least two bytes for any other value, and most delta-times aren't zero.) Delta-time is in some fraction of a beat (or a second, for recording a track with SMPTE times), as specified in the header chunk. = | | is any MIDI channel message. Running status is used: status bytes may be omitted after the first byte. The first event in a file must specify status. Delta-time is not considered an event itself: it is an integral part of the specification. Notice that running status occurs across delta-times. specifies non-MIDI information useful to this format or to sequencers, with this syntax: FF All meta-events begin with FF, then have an event type byte (which is always less than 128), and then have the length of the data stored as a variable-length quantity, and then the data itself. If there is no data, the length is 0. As with sysex events, running status is not allowed. As with chunks, future meta-events may be designed which may not be known to existing programs, so programs must properly ignore meta-events which they do not recognize, and indeed, should expect to see them. New for 0.06: programs must never ignore the length of a meta-event which they do recognize, and they shouldn't be surprised if it's bigger than they expected. If so, they must ignore everything past what they know about. However, they must not add anything of their own to the end of a meta-event. is used to specify a MIDI system exclusive message, or as an "escape" to specify any arbitrary bytes to be transmitted. Unfortunately, some synthesizer manufacturers specify that their system exclusive messages are to be transmitted as little packets. Each packet is only part of an entire syntactical system exclusive message, but the times they are transmitted at are important. Examples of this are the bytes sent in a CZ patch dump, or the FB-01's "system exclusive mode" in which microtonal data can be transmitted. To be able to handle situations like these, two forms of are provided: F0 F7 In both cases, is stored as a variable-length quantity. It is equal to the number of bytes following it, not including itself or the message type (F0 or F7), but all the bytes which follow, including any F7 at the end which is intended to be transmitted. The first form, with the F0 code, is used for syntactically complete system exclusive messages, or the first packet an a series Q that is, messages in which the F0 should be transmitted. The second form is used for the remainder of the packets within a syntactic sysex message, which do not begin with F0. Of course, the F7 is not considered part of the system exclusive message. Of course, just as in MIDI, running status is not allowed, in this case because the length is stored as a variable-length quantity which may or may not start with bit 7 set. (New to 0.06) A syntactic system exclusive message must always end with an F7, even if the real-life device didn't send one, so that you know when you've reached the end of an entire sysex message without looking ahead to the next event in the MIDI file. This principle is repeated and illustrated in the paragraphs below. The vast majority of system exclusive messages will just use the F0 format. For instance, the transmitted message F0 43 12 00 07 F7 would be stored in a MIDI file as F0 05 43 12 00 07 F7. As mentioned above, it is required to include the F7 at the end so that the reader of the MIDI file knows that it has read the entire message. For special situations when a single system exclusive message is split up, with parts of it being transmitted at different times, such as in a Casio CZ patch transfer, or the FB-01's "system exclusive mode", the F7 form of sysex event is used for each packet except the first. None of the packets would end with an F7 except the last one, which must end with an F7. There also must not be any transmittable MIDI events in- between the packets of a multi-packet system exclusive message. Here is an example: suppose the bytes F0 43 12 00 were to be sent, followed by a 200-tick delay, followed by the bytes 43 12 00 43 12 00, followed by a 100-tick delay, followed by the bytes 43 12 00 F7, this would be in the MIDI File: F0 03 43 12 00 81 48 200-tick delta-time F7 06 43 12 00 43 12 00 64 100-tick delta-time F7 04 43 12 00 F7 The F7 event may also be used as an "escape" to transmit any bytes whatsoever, including real-time bytes, song pointer, or MIDI Time Code, which are not permitted normally in this specification. No effort should be made to interpret the bytes used in this way. Since a system exclusive message is not being transmitted, it is not necessary or appropriate to end the F7 event with an F7 in this case. 2 Header Chunk The header chunk at the beginning of the file specifies some basic information about the data in the file. The data section contains three 16-bit words, stored high byte first (of course). Here's the syntax of the complete chunk: As described above, is the four ASCII characters 'MThd'; is a 32-bit representation of the number 6 (high byte first). The first word, format, specifies the overall organization of the file. Only three values of format are specified: 0 the file contains a single multi-channel track 1 the file contains one or more simultaneous tracks (or MIDI outputs) of a sequence 2 the file contains one or more sequentially independent single-track patterns The next word, ntrks, is the number of track chunks in the file. The third word, division, is the division of a quarter-note represented by the delta-times in the file. (If division is negative, it represents the division of a second represented by the delta-times in the file, so that the track can represent events occurring in actual time instead of metrical time. It is represented in the following way: the upper byte is one of the four values -24, -25, -29, or -30, corresponding to the four standard SMPTE and MIDI time code formats, and represents the number of frames per second. The second byte (stored positive) is the resolution within a frame: typical values may be 4 (MIDI time code resolution), 8, 10, 80 (bit resolution), or 100. This system allows exact specification of time-code-based tracks, but also allows millisecond-based tracks by specifying 25 frames/sec and a resolution of 40 units per frame.) Format 0, that is, one multi-channel track, is the most interchangeable representation of data. One application of MIDI files is a simple single-track player in a program which needs to make synthesizers make sounds, but which is primarily concerned with something else such as mixers or sound effect boxes. It is very desirable to be able to produce such a format, even if your program is track-based, in order to work with these simple programs. On the other hand, perhaps someone will write a format conversion from format 1 to format 0 which might be so easy to use in some setting that it would save you the trouble of putting it into your program. Programs which support several simultaneous tracks should be able to save and read data in format 1, a vertically one-dimensional form, that is, as a collection of tracks. Programs which support several independent patterns should be able to save and read data in format 2, a horizontally one-dimensional form. Providing these minimum capabilities will ensure maximum interchangeability. MIDI files can express tempo and time signature, and they have been chosen to do so for transferring tempo maps from one device to another. For a format 0 file, the tempo will be scattered through the track and the tempo map reader should ignore the intervening events; for a format 1 file, the tempo map must (starting in 0.04) be stored as the first track. It is polite to a tempo map reader to offer your user the ability to make a format 0 file with just the tempo, unless you can use format 1. All MIDI files should specify tempo and time signature. If they don't, the time signature is assumed to be 4/4, and the tempo 120 beats per minute. In format 0, these meta-events should occur at least at the beginning of the single multi-channel track. In format 1, these meta- events should be contained in the first track. In format 2, each of the temporally independent patterns should contain at least initial time signature and tempo information. We may decide to define other format IDs to support other structures. A program reading an unfamiliar format ID should return an error to the user rather than trying to read further. 3 Meta-Events A few meta-events are defined herein. It is not required for every program to support every meta-event. Meta-events initially defined include: FF 00 02 ssss Sequence Number This optional event, which must occur at the beginning of a track, before any nonzero delta-times, and before any transmittable MIDI events, specifies the number of a sequence. The number in this track corresponds to the sequence number in the new Cue message discussed at the summer 1987 MMA meeting. In a format 2 MIDI file, it is used to identify each "pattern" so that a "song" sequence using the Cue message to refer to the patterns. If the ID numbers are omitted, the sequences' locations in order in the file are used as defaults. In a format 0 or 1 MIDI file, which only contain one sequence, this number should be contained in the first (or only) track. If transfer of several multitrack sequences is required, this must be done as a group of format 1 files, each with a different sequence number. FF 01 len text Text Event Any amount of text describing anything. It is a good idea to put a text event right at the beginning of a track, with the name of the track, a description of its intended orchestration, and any other information which the user wants to put there. Text events may also occur at other times in a track, to be used as lyrics, or descriptions of cue points. The text in this event should be printable ASCII characters for maximum interchange. However, other character codes using the high-order bit may be used for interchange of files between different programs on the same computer which supports an extended character set. Programs on a computer which does not support non-ASCII characters should ignore those characters. (New for 0.06 ). Meta event types 01 through 0F are reserved for various types of text events, each of which meets the specification of text events(above) but is used for a different purpose: FF 02 len text Copyright Notice Contains a copyright notice as printable ASCII text. The notice should contain the characters (C), the year of the copyright, and the owner of the copyright. If several pieces of music are in the same MIDI file, all of the copyright notices should be placed together in this event so that it will be at the beginning of the file. This event should be the first event in the first track chunk, at time 0. FF 03 len text Sequence/Track Name If in a format 0 track, or the first track in a format 1 file, the name of the sequence. Otherwise, the name of the track. FF 04 len text Instrument Name A description of the type of instrumentation to be used in that track. May be used with the MIDI Prefix meta-event to specify which MIDI channel the description applies to, or the channel may be specified as text in the event itself. FF 05 len text Lyric A lyric to be sung. Generally, each syllable will be a separate lyric event which begins at the event's time. FF 06 len text Marker Normally in a format 0 track, or the first track in a format 1 file. The name of that point in the sequence, such as a rehearsal letter or section name ("First Verse", etc.). FF 07 len text Cue Point A description of something happening on a film or video screen or stage at that point in the musical score ("Car crashes into house", "curtain opens", "she slaps his face", etc.) FF 2F 00 End of Track This event is not optional. It is included so that an exact ending point may be specified for the track, so that it has an exact length, which is necessary for tracks which are looped or concatenated. FF 51 03 tttttt Set Tempo, in microseconds per MIDI quarter-note This event indicates a tempo change. Another way of putting "microseconds per quarter-note" is "24ths of a microsecond per MIDI clock". Representing tempos as time per beat instead of beat per time allows absolutely exact long-term synchronization with a time-based sync protocol such as SMPTE time code or MIDI time code. This amount of accuracy provided by this tempo resolution allows a four-minute piece at 120 beats per minute to be accurate within 500 usec at the end of the piece. Ideally, these events should only occur where MIDI clocks would be located Q this convention is intended to guarantee, or at least increase the likelihood, of compatibility with other synchronization devices so that a time signature/tempo map stored in this format may easily be transferred to another device. FF 54 05 hr mn se fr ff SMPTE Offset (New in 0.06 - SMPTE Format specification) This event, if present, designates the SMPTE time at which the track chunk is supposed to start. It should be present at the beginning of the track, that is, before any nonzero delta-times, and before any transmittable MIDI events. The hour must be encoded with the SMPTE format, just as it is in MIDI Time Code. In a format 1 file, the SMPTE Offset must be stored with the tempo map, and has no meaning in any of the other tracks. The ff field contains fractional frames, in 100ths of a frame, even in SMPTE-based tracks which specify a different frame subdivision for delta-times. FF 58 04 nn dd cc bb Time Signature The time signature is expressed as four numbers. nn and dd represent the numerator and denominator of the time signature as it would be notated. The denominator is a negative power of two: 2 represents a quarter-note, 3 represents an eighth-note, etc. The cc parameter expresses the number of MIDI clocks in a metronome click. The bb parameter expresses the number of notated 32nd-notes in a MIDI quarter- note (24 MIDI Clocks). This was added because there are already multiple programs which allow the user to specify that what MIDI thinks of as a quarter-note (24 clocks) is to be notated as, or related to in terms of, something else. Therefore, the complete event for 6/8 time, where the metronome clicks every three eighth-notes, but there are 24 clocks per quarter-note, 72 to the bar, would be (in hex): FF 58 04 06 03 24 08 That is, 6/8 time (8 is 2 to the 3rd power, so this is 06 03), 32 MIDI clocks per dotted-quarter (24 hex!), and eight notated 32nd-notes per MIDI quarter note. FF 59 02 sf mi Key Signature sf = -7: 7 flats sf = -1: 1 flat sf = 0: key of C sf = 1: 1 sharp sf = 7: 7 sharps mi = 0: major key mi = 1: minor key FF 7F len data Sequencer-Specific Meta-Event Special requirements for particular sequencers may use this event type: the first byte or bytes of data is a manufacturer ID. However, as this is an interchange format, growth of the spec proper is preferred to use of this event type. This type of event may be used by a sequencer which elects to use this as its only file format; sequencers with their established feature-specific formats should probably stick to the standard features when using this format. 4 Program Fragments and Example MIDI Files Here are some of the routines to read and write variable-length numbers in MIDI Files. These routines are in C, and use getc and putc, which read and write single 8-bit characters from/to the files infile and outfile. WriteVarLen (value) register long value; { register long buffer; buffer = value & 0x7f; while ((value >>= 7) > 0) { buffer <<= 8; buffer |= 0x80; buffer += (value & 0x7f); } while (TRUE) { putc(buffer,outfile); if (buffer & 0x80) buffer >>= 8; else break; } } doubleword ReadVarLen () { register doubleword value; register byte c; if ((value = getc(infile)) & 0x80) { value &= 0x7f; do { value = (value << 7) + ((c = getc(infile)) & 0x7f); } while (c & 0x80); } return (value); } As an example, MIDI Files for the following excerpt are shown below. First, a format 0 file is shown, with all information intermingled; then, a format 1 file is shown with all data separated into four tracks: one for tempo and time signature, and three for the notes. A resolution of 96 "ticks" per quarter note is used. A time signature of 4/4 and a tempo of 120, though implied, are explicitly stated. The contents of the MIDI stream represented by this example are broken down here: Delta Time(decimal) Event Code (hex) Other Bytes (decimal) Comment 0 FF 58 04 04 02 24 08 4 bytes: 4/4 time, 24 MIDI clocks/click, 8 32nd notes/24 MIDI clocks 0 FF 51 03 500000 3 bytes: 500,000 5sec per quarter-note 0 C0 5 Ch. 1 Program Change 5 0 C0 5 Ch. 1 Program Change 5 0 C1 46 Ch. 2 Program Change 46 0 C2 70 Ch. 3 Program Change 70 0 92 48 96 Ch. 3 Note On C2, forte 0 92 60 96 Ch. 3 Note On C3, forte 96 91 67 64 Ch. 2 Note On G3, mezzo-forte 96 90 76 32 Ch. 1 Note On E4, piano 192 82 48 64 Ch. 3 Note Off C2, standard 0 82 60 64 Ch. 3 Note Off C3, standard 0 81 67 64 Ch. 2 Note Off G3, standard 0 80 76 64 Ch. 1 Note Off E4, standard 0 FF 2F 00 Track End The entire format 0 MIDI file contents in hex follow. First, the header chunk: 4D 54 68 64 MThd 00 00 00 06 chunk length 00 00 format 0 00 01 one track 00 60 96 per quarter-note Then, the track chunk. Its header, followed by the events (notice that running status is used in places): 4D 54 72 6B MTrk 00 00 00 3B chunk length (59) Delta-time Event Comments 00 FF 58 04 04 02 18 08 time signature 00 FF 51 03 07 A1 20 tempo 00 C0 05 Ch. 1 Program Change 05 00 C1 2E Ch. 2 Program Change 2E 00 C2 46 00 92 30 60 Ch. 3 Note On 00 3C 60 running status 60 91 43 40 60 90 4C 20 81 40 82 30 40 two-byte delta-time 00 3C 40 running status 00 81 43 40 00 80 4C 40 00 FF 2F 00 end of track A format 1 representation of the file is slightly different. Its header chunk: 4D 54 68 64 MThd 00 00 00 06 chunk length 00 01 format 1 00 04 four tracks 00 60 96 per quarter-note First, the track chunk for the time signature/tempo track. Its header, followed by the events: 4D 54 72 6B MTrk 00 00 00 14 chunk length (20) Delta-time Event Comments 00 FF 58 04 04 02 18 08 time signature 00 FF 51 03 07 A1 20 tempo 83 00 FF 2F 00 end of track Then, the track chunk for the first music track. The MIDI convention for note on/off running status is used in this example: 4D 54 72 6B MTrk 00 00 00 10 chunk length (16) Delta-time Event Comments 00 C0 05 81 40 90 4C 20 81 40 4C 00 Running status: note on, vel = 0 00 FF 2F 00 end of track Then, the track chunk for the second music track: 4D 54 72 6B MTrk 00 00 00 0F chunk length (15) Delta-time Event Comments 00 C1 2E 60 91 43 40 82 20 43 00 running status 00 FF 2F 00 end of track Then, the track chunk for the third music track: 4D 54 72 6B MTrk 00 00 00 15 chunk length (21) Delta-time Event Comments 00 C2 46 00 92 30 60 00 3C 60 running status 83 00 30 00 two-byte delta-time, running status 00 3C 00 running status 00 FF 2F 00 end of track 5 MIDI Transmission of MIDI Files Since it is inconvenient to exchange disks between different computers, and since many computers which will use this format will have a MIDI interface anyway, MIDI seems like a perfect way to send these files from one computer to another. And, while we're going through all the trouble to make a way of sending MIDI Files, it would be nice if they could send any files (like sampled sound files, text files, etc.) Goals The transmission protocol for MIDI files should be reasonably efficient, should support fast transmission for computers which are capable of it, and slower transmission for less powerful ones. It should not be impossible to convert a MIDI File to or from an arbitrary internal representation on the fly as it is transmitted, but, as long as it is not too difficult, it is very desirable to use a generic method so that any file type could be accommodated. To make the protocol efficient, the MIDI transmission of these files will take groups of seven 8-bit bytes and transmit them as eight 7-bit MIDI data bytes. This is certainly in the spirit of the rest of this format (keep it small, because it's not that hard to do). To accommodate a wide range of transmission speeds, files will be transmitted in packets with acknowledge -- this allows data to be stored to disk as it is received. If the sender does not receive a response >from a reader in a certain amount of time, it can assume an open-loop situation, and then just continue. The last edition of MIDI Files contained a specialized protocol for sending just MIDI Files. To meet a deadline, unfortunately I don't have time right now to propose a new generalized protocol. This will be done within the next couple of months. I would welcome any proposals anyone else has, and would direct your attention to the proposal from Ralph Muha of Kurzweil, available in a recent MMA bulletin, and also directly >from him. -- John Janssen Email: johnj@echo.tds.philips.nl <-- will stop soon(?) The Netherlands or: John.Janssen@atehv.bso.nl <-- starts Nov. 92 Work: +31 40 756425 Home: +31 77 513177 Atari Mega STE, PC 386 SX, MIDI, C ----------------------------------------------------------------- -- >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< zappe@gaea.sietec.de | | |--+- happy Harald Zappe | |/ composing work: +49-30-386-28328/29 / home: +49-30-ASK-ME /___